您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