2013-07-14 2 views
3

스크립트가 실행되는 동안 주기적으로 출력물을 읽을 수 있도록하려면 어떻게해야합니까?lua에서 콘솔 출력을 실시간으로 읽음

youtube-dl의 경우, 다운로드되는 비디오에 대한 다운로드 정보 (진행률/속도/η)를 터미널에 보냅니다. 나는 임시 파일 (리눅스에서) 스크립트 출력의 전체 결과를 캡처 할 수 있어요 다음 코드와

:

대신에 모든 데이터를 완료하기 위해 스크립트를 기다리고 및 작성
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

이 비록 바이너리 데이터에 잘 작동하지 않을 것입니다. 왜냐하면 그것들과'\ r \ n'을 걸러 내기 때문입니다. 'pipe : read (4 * 1048576)'와 같은 지정된 최대 버퍼 크기를 읽는 것이 더 낫습니다. – dualed

+0

@dualed - 예, 사람이 읽을 수있는 순수 텍스트 출력의 경우에도 전체 라인을 읽는 것이 진행 막대의 현재 위치를 얻는 데 적합하지 않을 수 있습니다 한 번에 하나의 별을 추가하여 –

+0

@EgorSkriptunoff ping 테스트가 작동했지만 youtube-dl (프린트 포함)으로 시도해 보았습니다. 진행 정보가 표시되기 전에 멈추는 것을 발견했습니다. 완료 될 때까지 여기에서 대기 한 다음 진행의 마지막 비트를 인쇄합니다 그래서 나는 내 문제를 해결하는 다른 방법을 찾아야한다. – logen

관련 문제