如何逐行读取子过程标准输出?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (146)

我的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()

我真正想要的行为是,过滤器脚本在从子进程接收到每一行时打印出来

更新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()
提问于
用户回答回答于

实际上,如果你整理了迭代器,那么缓冲现在可能是你的问题:

proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)

改成

proc = subprocess.Popen(['python','-u', 'fake_utility.py'],stdout=subprocess.PIPE)

在从python内部调用python时 ,必须这么做

用户回答回答于

解决办法是使用readline()

#filters output
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
while True:
  line = proc.stdout.readline()
  if line != '':
    #the real code does filtering here
    print "test:", line.rstrip()
  else:
    break

当然,仍然需要处理子进程的缓冲。

扫码关注云+社区

领取腾讯云代金券