从子进程读取流输入。

从子进程读取流输入。

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

如何打印出该过程的每一行stdout这样,我就可以看到生成的输出,但在继续之前,还会阻止进程终止吗?

subprocess.communicate()似乎同时给出了所有的输出。


守着一只汪
浏览 599回答 4
4回答

红颜莎娜

要获得子进程的逐行输出,只要子进程刷新了它的标准输出缓冲区:#!/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 exititer()用于在行被写入解决方案时立即读取它们。Python 2中的预读错误.如果子进程的stdout在非交互模式下使用块缓冲而不是行缓冲(这会导致输出延迟,直到子进程的缓冲区已满或被子进程显式刷新为止),那么您可以尝试使用pexpect, pty模块或unbuffer, stdbuf, script公用事业,见问:为什么不直接使用管道(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)编码)

三国纷争

如果你想要一种非阻塞的方法,不要使用process.communicate()..如果您设置subprocess.Popen()论辩stdout到PIPE,您可以从process.stdout并检查进程是否仍然使用process.poll().
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python