2011-11-09 44 views
8

我想從python子流程中獲取輸出(打印語句)和返回狀態,並顯示日誌信息。我在Windows XP上使用Python 2.5。我如何獲得返回碼?在這個摘錄中,我正在讀取輸出,以便我可以將它重定向到在單獨的線程中顯示在wxPython TextCtrl中。Python子流程的返回值

self.myproc.poll()      
if self.myproc.returncode is None:    
    # Still running so check stdout 
    txt = self.myproc.stdout.read(self._readblock)  
    if txt:   
     # Add to UI's update queue 
     self._parent.AppendUpdate(txt)   
    else: 
     break  

回答

7

的返回碼得到由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.stdout0當我們讀到出局self.myproc.poll(或第一輪投票後的self.myproc.returncode)。

這個返回代碼的目的是,你不必解析所有的子進程的輸出,以確定是否取得了成功,作業:您可以自由定義自己的退出代碼。例如,您可以考慮0爲成功,1爲失敗,2爲某種給定的無效輸入,9爲未知錯誤,依此類推。這樣,你可以只保留poll荷蘭國際集團的過程中,基於由調查可以直接知道它是成功返回的退出代碼。請注意,由於您需要輸出子進程的輸出,所以對於您的情況有點不太適用,但仍然更容易解析數字而不是字符串以確定成功。

+0

我的進程中的命令是一個python文件,並返回一個值,例如像'Pass'或'Fail'這樣的字符串。我只是得到像0或1的返回值 – user974168

+0

啊,那麼你只需要分析'stdout'的最後一行。返回碼是程序退出條件的指示,並且是一個整數。 – jro

+0

對不起,我沒有理解你的評論。爲了便於討論被叫過程是這樣的變形點焊主(): 1 = 5 B = 6 C = A + B 打印Ç 返回 'PASS' 如果__name__ == '__main__': main()中 如何獲得返回值'PASS'? – user974168