python subprocess不会写入标准输出
问题描述:
如果我运行下面的python代码(在python 2.7中),我会得到一个空的输出文件,而我期望一行。哪里不对?python subprocess不会写入标准输出
import subprocess
with open('outfile.out', 'w') as out:
pp=subprocess.Popen(['/bin/cat'],stdin=subprocess.PIPE,stdout=out)
pp.stdin.write('Line I want into out file\n')
pp.terminate()
答
您terminate
d的过程中,从来没有刷新/关闭输入到它,所以所有的数据被卡在缓冲区,当程序被强行杀死了被丢弃。您可以使用communicate
路过输入,收盘stdin
,然后等待合并的过程来完成:
import subprocess
with open('outfile.out', 'w') as out:
pp=subprocess.Popen(['/bin/cat'],stdin=subprocess.PIPE,stdout=out)
pp.communicate('Line I want into out file\n')
在此情况下(只有三个标准手柄中的一个是管道),你也可以这样做安全:
import subprocess
with open('outfile.out', 'w') as out:
pp=subprocess.Popen(['/bin/cat'],stdin=subprocess.PIPE,stdout=out)
pp.stdin.write('Line I want into out file\n')
pp.stdin.close()
pp.wait() # Optionally with a timeout, calling terminate if it doesn't join quickly
这应该只是如果你只使用一个标准句柄作为PIPE
;如果不止一个是PIPE
,那么存在死锁的风险(小孩正在写入标准输出,等待您读取以清除缓冲区,您正在写入标准输入,等待孩子读取以清除缓冲区),即communicate
可以解决使用线程或选择模块,并且您必须模仿该设计以避免死锁。
使用'pp.wait()'而不是'pp.join()'(它是'subprocess',而不是'multiprocessing')。 Python 2.7中没有'timeout'参数(除非你使用'subprocess32'模块)。 – jfs
@ J.F.Sebastian:修正了'wait'与'join'位;您的评论可以澄清什么时候有'超时'可用。 – ShadowRanger