2011-02-09 132 views
2

从python代码中,我想运行一个二进制程序,从stdin中获取它的参数。使用子进程模块,这应该是直接的:subprocess.Popen和缓冲过程输出

import subprocess 
command = [ 'my_program' ] 
p = subprocess.Popen(command, \ 
     stdin = subprocess.PIPE, stdout = subprocess.PIPE, \ 
     env={ "GFORTRAN_UNBUFFERED_ALL": "1"}) 
p.stdin.write (stdin_stuff) 
while True: 
    o = p.stdout.readline() 
    if p.poll() != None: 
    break 
    # Do something with stdout 

现在,这启动程序,但python脚本只是挂在那里。我明白,这可能是由于gfortran(我用它来编译my_program缓冲它的标准输出流,gfortran允许使用GFORTRAN_UNBUFFERED_ALL环境变量,就像我所做的那样),以及在Fortran代码中使用FLUSH()内部函数,但仍没有运气:在Python代码仍然挂起

+0

您可以通过“检查”旁边的标记来接受您喜欢的答案。在这个网站上这被认为是礼貌的,所以你可能想要检查你所问的问题最满意的答案。 – 2011-02-09 23:31:38

回答

4

你应该使用Popen.communicate()将字符串发送到进程的stdin而不是手工编写它有更好的运气

stdoutdata, stderrdata = p.communicate(stdin_stuff) 
2

为了补充Aphex's answer,在这里。 documentation的相关部分:

警告

使用communicate()而非.stdin.write.stdout.read.stderr.read避免死锁由于任何其他操作系统管缓冲区填满并阻塞子进程。

+0

这可能更适合作为@Aphex的更新或评论。这似乎不是一个好的答案。 – 2011-02-09 17:02:25