的返回碼得到由poll
調用返回,並且也(曾經poll
未返回None
)通過returncode
屬性訪問。你已經在你的代碼中使用了這個,所以我不確定你的問題是什麼。
當您想要在進程運行時更新控件時,請使用readline
而不是read
:後者將等待整個輸出存在,而前者將等待換行符。要使用您的變量名給一個完整的例子:
from subprocess import Popen, PIPE
self.myproc = Popen('dir /s', shell=True, stdout=PIPE, stderr=PIPE)
while self.myproc.poll() == None:
self._parent.AppendUpdate(self.myproc.stdout.readline())
self._parent.AppendUpdate('Return code was ' + self.myproc.returncode)
請注意,你可能想.strip()
的readline
結果作爲它將包含換行符。
編輯:爲了解決腳本輸出與其返回碼之間的混淆,請參閱以下內容。首先,模塊級的Python腳本無法返回值:這會產生語法錯誤。所以你應該區分的是腳本的輸出和它給出的返回碼。
腳本的輸出在上面的示例中,使用self.myproc.stdout.readline
方法讀取。每當外部進程產生一行輸出文本時,調用該函數將檢索它。
但是返回代碼(或退出狀態)是一個從子進程傳遞到父進程的整數,指示子進程退出的狀態。在Python中,您可以使用sys.exit
函數來執行此操作。最常見的是,當這個值爲零時,表示成功;一個非零值描述了某種錯誤。
說你的子進程的腳本是這樣的:
import sys
# Do some stuff
print 'pass' # Gets to stdout
sys.exit(0) # Return code
執行這個外部文件(姑且稱之爲test.py
)與Popen
類,我們將得到pass
當我們讀出self.myproc.stdout
和0
當我們讀到出局self.myproc.poll
(或第一輪投票後的self.myproc.returncode
)。
這個返回代碼的目的是,你不必解析所有的子進程的輸出,以確定是否取得了成功,作業:您可以自由定義自己的退出代碼。例如,您可以考慮0
爲成功,1
爲失敗,2
爲某種給定的無效輸入,9
爲未知錯誤,依此類推。這樣,你可以只保留poll
荷蘭國際集團的過程中,基於由調查可以直接知道它是成功返回的退出代碼。請注意,由於您需要輸出子進程的輸出,所以對於您的情況有點不太適用,但仍然更容易解析數字而不是字符串以確定成功。
來源
2011-11-09 08:02:40
jro
我的進程中的命令是一個python文件,並返回一個值,例如像'Pass'或'Fail'這樣的字符串。我只是得到像0或1的返回值 – user974168
啊,那麼你只需要分析'stdout'的最後一行。返回碼是程序退出條件的指示,並且是一個整數。 – jro
對不起,我沒有理解你的評論。爲了便於討論被叫過程是這樣的變形點焊主(): 1 = 5 B = 6 C = A + B 打印Ç 返回 'PASS' 如果__name__ == '__main__': main()中 如何獲得返回值'PASS'? – user974168