如何在使用Python的subprocess
模塊和communicate()
方法時檢索退出代碼?如何在使用Python子進程通信方法時獲取退出代碼?
相關代碼:
import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]
我應該做這另一種方式?
如何在使用Python的subprocess
模塊和communicate()
方法時檢索退出代碼?如何在使用Python子進程通信方法時獲取退出代碼?
相關代碼:
import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]
我應該做這另一種方式?
Popen.communicate
將在完成(*)時設置returncode
屬性。下面是相關文檔部分:
Popen.returncode
The child return code, set by poll() and wait() (and indirectly by communicate()).
A None value indicates that the process hasn’t terminated yet.
A negative value -N indicates that the child was terminated by signal N (Unix only).
所以,你可以這樣做(我沒有測試它,但它應該工作):
import subprocess as sp
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
streamdata = child.communicate()[0]
rc = child.returncode
(*)會出現這種情況,因爲方式它的實現:在設置線程讀取子流之後,它只調用wait
。
exitcode = data.wait()
。子進程將被阻塞如果它寫入標準輸出/錯誤,和/或從標準輸入讀取,並且沒有對等體。
您應該首先確保該過程已完成運行,並使用.wait
方法讀取了返回碼。這將返回代碼。如果您想稍後訪問它,則將其作爲.returncode
存儲在Popen
對象中。
'.communicate()'已經等待子進程終止。 – 2013-08-21 07:10:49
.poll()
將更新返回碼。
嘗試
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
returnCode = child.poll()
此外,.poll()
被調用後返回的代碼可以在對象child.returncode
。
這個例子對我很有幫助,但是如果例子沒有將「import subprocess as sp」模式導入標準作爲一個不起眼的縮寫,那將會很好。雖然這會削減跟隨它的代碼8個字符,但它也使得難以理解和重用。 – uglycoyote 2016-10-19 18:36:45
@uglycoyote沒有規定說你必須複製和粘貼。只要重新鍵入它就可以了,就像4線一樣。 – 2016-10-31 13:45:55
@uglycoyote你也可以將它編輯爲'from subprocess import Popen',然後使用'Popen'而不是'subprocess(或sp).Popen',這可能會增加可讀性並縮短行數 – Mitch 2016-11-18 18:43:30