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可以解决使用线程或选择模块,并且您必须模仿该设计以避免死锁。

+1

使用'pp.wait()'而不是'pp.join()'(它是'subprocess',而不是'multiprocessing')。 Python 2.7中没有'timeout'参数(除非你使用'subprocess32'模块)。 – jfs

+0

@ J.F.Sebastian:修正了'wait'与'join'位;您的评论可以澄清什么时候有'超时'可用。 – ShadowRanger