2016-07-07 50 views
0

即使調用proc.terminate()後,仍然掛起對proc.communicate()的調用仍然掛起的問題。終止後Python子進程通信失敗

我創建任務在後臺與呼叫

import subprocess as sub 
p = sub.Popen(command, stdout=sub.PIPE, stderr=sub.PIPE, shell=False) 

在腳本完成運行,我叫terminate()communicate(),並wait()從過程收集信息。

p.terminate() 
errorcode = p.wait() 
(pout, perr) = p.communicate() 

腳本掛在通話的通話。我假設任何接到呼叫終止的呼叫都會立即返回。這有什麼原因會導致失敗?

編輯:我使用這種方法,因爲命令是一個真正的緊密循環,不會自行終止。我想使用p.terminate()來做到這一點,然後看看stdout和stderr提供了什麼。

+3

當然,你剛剛終止了它,爲什麼你不只是打電話溝通? –

+0

如果'p.wait()'返回但p.communicate()'「掛起」,那麼它可能與[Python子進程.check_call vs .check_output]有關(http://stackoverflow.com/q/36169571/4279 )('check_call()'在內部調用'.wait()','check_output()'在內部調用'.communicate()')。不相關:不需要顯式調用p.wait():'p.wait()'在內部調用,因此你可以在'p.communicate()'返回後使用'p.returncode'。一般來說,在p.communicate()之前調用'p.wait()'是一個糟糕的做法,它可能會阻塞一個活動進程(在這種情況下不適用 - 進程已經死了)。 – jfs

+0

@PadraicCunningham:它不是那麼簡單,例如,如果子進程沒有顯式地終止它,它就不會退出。另一種情況:如果子進程可能產生自己的子進程,那麼'p.communicate()'可能會延遲;閱讀我的答案[鏈接問題](http://stackoverflow.com/q/36169571/4279)。 – jfs

回答

1

你不需要前兩個語句。請致電communicate()