2014-09-19 1 views
0

Я пытаюсь запустить внешнюю команду в 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 
} 

Это глупо ... но это работает.

Не более элегантный способ и более эффективный способ сделать это? Производительность ужасна, как будто «частота обновления» была медленной.

ответ

0

Установите входной разделитель записей в «\ г» прямо перед вашим блоком (при условии, что вы знаете, это заранее):

$/ = "\r" 

Ссылка глобальных заданных переменных: http://www.zenspider.com/Languages/Ruby/QuickRef.html#pre-defined-variables

+0

спасибо ... но есть также тех \ n я хочу поймать. Я просто хочу получить вывод, как если бы я вызывал команду из оболочки, а не из ruby! – MichaelC