我的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()
我真正想要的行为是让过滤器脚本在从子进程接收到每一行时打印它。有点像tee
所做的,但使用的是python代码。
我遗漏了什么?这有可能吗?
更新:
如果将sys.stdout.flush()
添加到fake_utility.py中,则代码在Python3.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()
https://stackoverflow.com/questions/2804543
复制相似问题