Я пытаюсь запустить внешнюю команду в Ruby и проанализировать ее вывод.Ruby: получить выход внешней команды, даже если нет разрыва строки
IO.popen(command, :err=>[:child, :out]) {|ls_io|
ls_io.each do |line|
print line
end
}
Этот способ сделать это творит чудеса ... кроме случаев, когда я разобрать прогресс-вывода с-программы, которая показывает, что прогресс на стандартный вывод с \ г.
До тех пор, пока c-программа не вывела \ n (до тех пор, пока она не закончилась долгое время), Ruby ждет и ничего не видит. Тогда, когда \ п выводится, Ruby видит все
1%\r2%\r3%\r…100%
task finished
Я попробовал все из многих способов вызова внешних команд (например, Calling shell commands from Ruby); но никто, кажется, не фиксирует прогресс. Я также пробовал все, например, STDOUT.sync = true
, и с-программа действительно звонит fflush(stdout)
Наконец-то я нашел рабочий стол. Я:
IO.popen(commande, :err=>[:child, :out]) {|ls_io|
while true
byte=ls_io.read(1)
if byte.nil?
break
end
print byte
end
}
Это глупо ... но это работает.
Не более элегантный способ и более эффективный способ сделать это? Производительность ужасна, как будто «частота обновления» была медленной.
спасибо ... но есть также тех \ n я хочу поймать. Я просто хочу получить вывод, как если бы я вызывал команду из оболочки, а не из ruby! – MichaelC