为了账号安全,请及时绑定邮箱和手机立即绑定

从子进程读取流输入。

从子进程读取流输入。

守着一只汪 2019-05-31 17:19:15
从子进程读取流输入。我用Python的subprocess.communicate()从运行大约一分钟的进程中读取stdout。如何打印出该过程的每一行stdout这样,我就可以看到生成的输出,但在继续之前,还会阻止进程终止吗?subprocess.communicate()似乎同时给出了所有的输出。
查看完整描述

4 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

要获得子进程的逐行输出,只要子进程刷新了它的标准输出缓冲区:

#!/usr/bin/env python2from 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中的预读错误.

如果子进程的stdout在非交互模式下使用块缓冲而不是行缓冲(这会导致输出延迟,直到子进程的缓冲区已满或被子进程显式刷新为止),那么您可以尝试使用pexpectpty模块unbufferstdbufscript公用事业,见问:为什么不直接使用管道(popen()?


下面是Python 3代码:

#!/usr/bin/env python3from subprocess import Popen, PIPEwith Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1,
           universal_newlines=True) as p:
    for line in p.stdout:
        print(line, end='')

注意:不像Python 2那样输出子进程的字节串;Python 3使用文本模式(cmd的输出使用locale.getpreferredencoding(False)编码)


查看完整回答
反对 回复 2019-05-31
?
三国纷争

TA贡献1804条经验 获得超7个赞

如果你想要一种非阻塞的方法,不要使用process.communicate()..如果您设置subprocess.Popen()论辩stdoutPIPE,您可以从process.stdout并检查进程是否仍然使用process.poll().


查看完整回答
反对 回复 2019-05-31
  • 4 回答
  • 0 关注
  • 598 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信