如何在不达到EOF的情况下读取IO流?

How to read IO stream without reaching EOF?

提问人:Aparichith 提问时间:11/4/2022 最后编辑:Aparichith 更新时间:11/4/2022 访问量:66

问:

在我正在使用的旧应用程序之一中,我们正试图通过实用程序获取提取的zip文件名。这分为两个命令。第一个命令解压缩压缩文件,第二个命令尝试列出并 grep 具有特定扩展名的文件名。但最近我们在读取 IO 缓冲区时开始遇到错误。Open3

# unzip with 7z
Open3.capture3("7z", "x", my_zip.path, "-p#{my_pass}", "-o#{tmp_dir}")

# extract file name with .dbf extension
resp, _threads = Open3.pipeline_r(["7z", "-slt", "l", "-p#{my_pass}", my_zip.path], ["grep", "-oP", "(?<=Path = ).+dbf"]) 

# read IO stream for filename
res_filename = resp.readline.strip

# close stream
# resp.close

在我们正在 enoutering .我试图使用而不是避免,但它会导致空/零值。resp.readline.stripEOFError::getsreadlineEOFError

我错过了什么?有没有办法将 IO 流转换为 String 对象或类似的东西?

观察到这在控制台上工作正常,但在从 sidekiq 仪表板调用作业时引发异常

Ruby-on-Rails Ruby IO popen Sidekiq

评论

0赞 Stefan 11/4/2022
这些命令是否在 Ruby 之外适用于导致 ?EOFError
0赞 Aparichith 11/4/2022
是的,他们确实@Stefan
0赞 Aparichith 11/4/2022
这个问题以前不存在。从一周开始
0赞 Aparichith 11/4/2022
刚刚观察到这些命令在控制台上工作正常。但是当我们从 sidekiq 将其排队时会引发错误
0赞 Stefan 11/4/2022
如果相同的代码曾经工作正常,那么问题的原因很可能在该代码之外,并且对我们来说不可重现。这可能是由于系统更新、Ruby 更新或某些配置更改造成的。关于“我试图使用 ::gets 而不是 readline 来避免 EOFError”——与其让错误沉默,不如首先尝试找出它发生的原因。 表示您的输入为空,即您的管道命令不会生成任何输出。EOFError

答: 暂无答案