내 파이썬 스크립트는 하위 프로세스를 사용하여 매우 시끄러운 리눅스 유틸리티를 호출합니다. 모든 출력을 로그 파일에 저장하고 일부를 사용자에게 보여주고 싶습니다. 나는 다음과 같이 작동 할 것이라고 생각했지만 유틸리티가 상당한 양의 출력을 생성 할 때까지 응용 프로그램에 출력이 표시되지 않습니다.
#fake_utility.py, just generates lots of output over time
import time
i = 0
while True:
print hex(i)*512
i += 1
time.sleep(0.5)
#filters output
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
for line in proc.stdout:
#the real code does filtering here
print "test:", line.rstrip()
필자가 실제로 원하는 동작은 필터 스크립트가 서브 프로세스로부터 수신 될 때 각 라인을 인쇄하는 것입니다. tee
파이썬 코드와 비슷 하지만 파이썬 코드와 비슷 합니다.
내가 무엇을 놓치고 있습니까? 이것도 가능합니까?
최신 정보:
a sys.stdout.flush()
가 fake_utility.py에 추가되면 코드는 python 3.1에서 원하는 동작을 갖습니다. 파이썬 2.6을 사용하고 있습니다. 사용 proc.stdout.xreadlines()
은 py3k와 동일하게 작동 한다고 생각 하지만 그렇지 않습니다.
업데이트 2 :
다음은 최소 작업 코드입니다.
#fake_utility.py, just generates lots of output over time
import sys, time
for i in range(10):
print i
sys.stdout.flush()
time.sleep(0.5)
#display out put line by line
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
#works in python 3.0+
#for line in proc.stdout:
for line in iter(proc.stdout.readline,''):
print line.rstrip()
print line,
대신에 사용할 수 있습니다print line.rstrip()
(주 : 끝에 쉼표).