Ruby IO.popen Буферизация STDOUT

Я работаю над сценарием, который использует IO.popen для открыть другую программу и постоянно читать данные. Это примерно так:

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

loop do
  line = process.gets
  puts "#{line}"
end

(Фактическая программа делает больше, чем просто выводит результат, очевидно - это всего лишь пример.)

Проблема, с которой я столкнулся, заключается в том, что popen, похоже, буферизует STDOUT из открытого процесса. Я подтвердил это, запустив программу прямо из оболочки и через popen, параллельно, а Ruby никогда не получает по одной строке за раз. Он всегда получает несколько строк за раз и задерживается.

Я пробовал

STDOUT.sync = true

... перед открытием, но это ничего не изменило.

Данная программа определенно использует \ n как новая строка, так что проблема не в этом.

7
задан Eddie 19 August 2011 в 04:51
поделиться