Pracuję nad skryptem, który używa IO.popen do otwarcia innego programu i ciągłego odczytu danych. To jest tak:Ruby IO.popen STDOUT buforowanie
process = IO.popen(["/the/program", "argument", "argument"])
loop do
line = process.gets
puts "#{line}"
end
(Rzeczywisty program robi więcej niż tylko drukowanie wyjścia, oczywiście - to tylko przykład).
Kwestia biegnę na to, że popen wydaje się być buforowanie STDOUT z otwartego procesu. Potwierdziłem to, uruchamiając program bezpośrednio z powłoki i poprzez popen, side-by-side, a Ruby nigdy nie dostaje jednej linii na raz. Zawsze pobiera wiele linii naraz i jest opóźniony.
Próbowałem
STDOUT.sync = true
... przed popen, ale to niczego nie zmieniło.
Ten program zdecydowanie używa \ n jako nowej linii, więc to nie jest problem.
Czy wypróbowałeś 'process.sync = true'? – DNNX
@Eddie to wymyśliłeś? –