Ruby IO.popen STDOUT缓冲

Edd*_*die 7 ruby popen

我正在编写一个脚本,它使用IO.popen打开另一个程序并不断读取数据.就像这样:

process = IO.popen(["/the/program", "argument", "argument"])

loop do
  line = process.gets
  puts "#{line}"
end
Run Code Online (Sandbox Code Playgroud)

(实际的程序不仅仅是打印输出,显然 - 这只是一个例子.)

我遇到的问题是popen似乎是从打开的进程中缓冲STDOUT.我已经通过直接从shell运行程序并通过popen并排运行来确认这一点,并且Ruby一次不会获得一行.它总是一次获得多行,并且被延迟.

我试过了

STDOUT.sync = true
Run Code Online (Sandbox Code Playgroud)

...在popen之前,但没有改变任何东西.

有问题的程序肯定使用\n作为新行,所以这不是问题.

cam*_*cam 6

你有其他程序的来源吗?您需要强制其他程序刷新其输出,或使您的脚本看起来像pty(请参阅pty标准库).

请参阅此问题以获得有关正在发生的事情的详细说明.

编辑:pty示例代码:

require 'pty'
PTY.spawn "some-command" do |r,w,p|
  loop { puts r.gets }
end
Run Code Online (Sandbox Code Playgroud)