2013-07-14 47 views
3

如何在運行時定期讀取腳本的輸出?在lua中實時讀取控制檯輸出

在youtube-dl的情況下,它發送關於下載到終端的視頻的下載信息(進度/速度/ 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