2013-07-14 6 views
3

Как я могу периодически просматривать вывод скрипта во время его работы?Чтение консольного вывода в реальном времени в lua

В случае youtube-dl он отправляет информацию о загрузке (progress/speed/eta) о загружаемом видео на терминал.

С помощью следующего кода я в состоянии захватить общий результат вывода скриптов (на Linux) во временный файл:

tmpFile = io.open("/tmp/My_Temp.tmp", "w+") 
f = io.popen("youtube-dl http://www.youtube.com/watch?v=UIqwUx_0gJI", 'r') 

tmpFile:write(f:read("*all")) 

Вместо того, чтобы ждать сценария, чтобы закончить и писать все данные в в конце я бы хотел записать «моментальные снимки» последней информации, которую youtube-dl отправил на терминал.

Моя общая цель - захватить информацию о загрузке, чтобы создать индикатор выполнения с использованием Iup.

Если есть более разумные способы получения информации о загрузке, я буду рад также получить совет.

Независимо от того, можно ли использовать io.popen(), os.execute() или другие инструменты таким образом, я все равно хотел бы знать, как захватить вывод консоли в реальном времени.

ответ

3

Это прекрасно работает как в Windows, так и в Linux. Строки отображаются в режиме реального времени.

local pipe = io.popen'ping google.com' 
for line in pipe:lines() do 
    print(line) 
end 
pipe:close() 

UPD:
Если предыдущий код не работает, попробуйте следующее (как dualed предложил):

local pipe = io.popen'youtube-dl with parameters' 
repeat 
    local c = pipe:read(1) 
    if c then 
     -- Do something with the char received 
     io.write(c) io.flush() 
    end 
until not c 
pipe:close() 
+0

Это не будет работать, а для двоичных данных, хотя. Во-первых, потому что вы, вероятно, не увидите, что много '\ n' в нем и второе, потому что оно будет фильтровать их и' \ r \ n'. Лучше читать заданный максимальный размер буфера, например 'pipe: read (4 * 1048576)' – dualed

+0

@dualed - Да, даже для чтения с чистого текста с чисто читаемым текстом целые строки могут оказаться непригодными для получения текущего положения индикатора выполнения добавив одну звезду за раз. –

+0

@EgorSkriptunoff Тест ping работал, однако, пытаясь использовать его с youtube-dl (с печатью), я обнаружил, что он зависает прямо до появления информации о прогрессе, он ждет здесь до тех пор, пока он не будет завершен, а затем просто распечатает последний бит прогресса , поэтому мне нужно найти другой способ решить мою проблему. – logen

Смежные вопросы