2011-04-12 27 views

回答

187

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

+7

這個例子對我很有幫助,但是如果例子沒有將「import subprocess as sp」模式導入標準作爲一個不起眼的縮寫,那將會很好。雖然這會削減跟隨它的代碼8個字符,但它也使得難以理解和重用。 – uglycoyote 2016-10-19 18:36:45

+5

@uglycoyote沒有規定說你必須複製和粘貼。只要重新鍵入它就可以了,就像4線一樣。 – 2016-10-31 13:45:55

+0

@uglycoyote你也可以將它編輯爲'from subprocess import Popen',然後使用'Popen'而不是'subprocess(或sp).Popen',這可能會增加可讀性並縮短行數 – Mitch 2016-11-18 18:43:30

4

exitcode = data.wait()。子進程將被阻塞如果它寫入標準輸出/錯誤,和/或從標準輸入讀取,並且沒有對等體。

7

您應該首先確保該過程已完成運行,並使用.wait方法讀取了返回碼。這將返回代碼。如果您想稍後訪問它,則將其作爲.returncode存儲在Popen對象中。

+15

'.communicate()'已經等待子進程終止。 – 2013-08-21 07:10:49

1

.poll()將更新返回碼。

嘗試

child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE) 
returnCode = child.poll() 

此外,.poll()被調用後返回的代碼可以在對象child.returncode

相關問題