Read console output realtime in lua

2019-06-26 09:52发布

问题:

How can I manage to periodically read the output of a script while it is running?

In the case of youtube-dl, it sends download information (progress/speed/eta) about the video being downloaded to the terminal.

With the following code I am able to capture the total result of the scripts output (on linux) to a temporary file:

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"))

Instead of waiting for the script to complete and writing all the data at the end, I would like able to capture "snapshots" of the latest information that youtube-dl has sent to the terminal.

My overall goal is to capture the download information in order to design a progress bar using Iup.

If there are more intelligent ways of capturing download information I will be happy to take advice as well.

Regardless, if it is possible to use io.popen(), os.execute(), or other tools in such a way I would still like to know how to capture the real time console output.

回答1:

This works fine both on Windows and Linux. Lines are displayed in real-time.

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

UPD :
If previous code didn't work try the following (as dualed suggested):

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()


标签: io console lua iup