Python:如何从subprocess.communicate()读取流输入?

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

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

我使用Python subprocess.communicate()运行了大约一分钟的进程读取stdout。

如何以流方式打印该进程的stdout的每一行,以便我可以在输出生成时看到输出,但在继续之前仍会阻止进程终止?

提问于
用户回答回答于

这是一个简单的例子(不检查错误):

import subprocess
proc = subprocess.Popen('ls',
                       shell=True,
                       stdout=subprocess.PIPE,
                       )
while proc.poll() is None:
    output = proc.stdout.readline()
    print output,

如果ls结束得太快,那么while循环可能会在你读完所有数据之前结束。

你可以通过这种方式捕获标准输出中的其余部分:

output = proc.communicate()[0]
print output,
用户回答回答于

一旦子流程刷新其标准输出缓冲区,即可逐行获取子流程输出:

#!/usr/bin/env python2
from subprocess import Popen, PIPE

p = Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1)
with p.stdout:
    for line in iter(p.stdout.readline, b''):
        print line,
p.wait() # wait for the subprocess to exit

iter()用于在写入行以解决Python 2中的预读错误时立即读取行。

这里是Python 3代码:

#!/usr/bin/env python3
from subprocess import Popen, PIPE

with Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1, universal_newlines=True) as p:
    for line in p.stdout:
        print(line, end='')

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励