首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >逐行读取子进程标准输出

逐行读取子进程标准输出
EN

Stack Overflow用户
提问于 2010-05-11 00:47:32
回答 9查看 430.3K关注 0票数 274

我的python脚本使用子进程来调用一个非常嘈杂的linux实用程序。我希望将所有输出存储到一个日志文件中,并向用户显示其中的一部分。我原以为下面的命令会起作用,但是直到实用程序产生了大量的输出后,输出才会出现在我的应用程序中。

代码语言:javascript
复制
#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:

下面是最小的工作代码。

代码语言:javascript
复制
#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()
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2804543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档