我的python脚本使用子进程来调用非常嘈杂的linux实用程序。我想将所有输出存储到日志文件中,并向用户显示其中的一些内容。我以为下面的方法可以工作,但是直到实用程序产生大量输出后,输出才出现在我的应用程序中。
#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()
我真正想要的行为是过滤器脚本打印从子流程接收到的每一行。Sorta像是做什么tee
,但带有python代码。
我想念什么?这有可能吗?
更新:
如果将a sys.stdout.flush()
添加到fake_utility.py中,则代码在python 3.1中具有所需的行为。我正在使用python 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()
(注意:末尾用逗号)。