2016-09-14 78 views
1

我有一个Python模块是这样的:将管道阻塞父进程

from subprocess import * 

cmdline = 'python example.py' 

result = Popen(cmdline,shell=False,stdout=PIPE,stderr=PIPE,stdin=PIPE).stdout 

我想父进程阻塞,直到子进程结束执行与父进程可以接收孩子的输出处理。上面的代码会服务于我的目的吗?根据我的理解,子进程会将其输出发送到PIPE而不是STDOUT,并且父进程将阻塞,直到子进程退出并且PIPE关闭。有人能解释我被误解的地方吗?

另一件事是要么沟通或check_output返回一个字节字符串,但我想一行一行地处理结果,有没有一个好办法呢?

回答

0

而不是做

result = Popen(cmdline,shell=False,stdout=PIPE,stderr=PIPE,stdin=PIPE).stdout` 

你应该做的:

stdout, stderr = Popen(cmdline,shell=False,stdout=PIPE,stderr=PIPE,stdin=PIPE).communicate() 

stdoutresult你希望的。 stderr是进程写入错误输出的地方。

+0

there *是*。* .check_output()'调用,它返回命令的输出并等待它返回,现在你知道了。 –

+0

check_output()返回一个字节字符串,但我想要逐行处理结果,有没有一种好的方法来做到这一点? @Wayne Werner – ascetic652

+0

@ ascetic652你的意思除了.decode()。split('\ n')'? –

0

不,你所做的是创建一个Popen对象result。您需要拨打result.wait()或更优选地拨打result.communicate()。更多信息Here