Python subprocess.Popen和缓冲进程输出
在python代码内部,我想运行一个二进制程序,从stdin获取其参数。使用子流程模块,这应该很简单:Python subprocess.Popen和缓冲进程输出,python,fortran,gfortran,Python,Fortran,Gfortran,在python代码内部,我想运行一个二进制程序,从stdin获取其参数。使用子流程模块,这应该很简单: import subprocess command = [ 'my_program' ] p = subprocess.Popen( command, \ stdin = subprocess.PIPE, stdout = subprocess.PIPE, \ env={ "GFORTRAN_UNBUFFERED_ALL": "1"} ) p.stdin.wr
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(我用来编译我的_程序正在缓冲它的标准数据流。gfortran允许一个人使用gfortran_UNBUFFERED_ALL环境变量,正如我所做的那样,以及使用FLUSH()fortran代码中固有的,但仍然没有运气:python代码仍然挂起。使用将字符串发送到进程'
stdin
,而不是手动写入
stdoutdata, stderrdata = p.communicate(stdin_stuff)
作为补充,以下是本协议的相关部分:
警告
使用communicate()
而不是.stdin.write
、.stdout.read
或.stderr.read
,以避免由于任何其他操作系统管道缓冲区填满并阻塞子进程而导致死锁
这可能更适合作为@Aphex的更新或注释。像这样的答案本身似乎不是一个好答案。@S.Lott:考虑过将其作为注释,但格式确实不能作为注释使用。这就是为什么我明确指出它是对Aphex答案的补充。“格式真的不能作为注释使用”.True。为什么不更新呢?
communicate
的input
参数是一个纯字符串,而不是流,因此如果输入数据可能很大,请将其放入生产者线程。如果输出数据可能很大,请按中的方式从输出中增量读取。您可以通过“检查”接受您喜欢的答案旁边的标记。在这个网站上这样做被认为是礼貌的,所以你可能想在你问的问题上检查你最喜欢的答案。