2016-06-28 158 views
1

如果我運行下面的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() 

回答

2

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