簡體   English   中英

從Python子進程返回值

[英]Return value from Python subprocess

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

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     

返回代碼由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函數執行此sys.exit 最常見的是,當該值為零時,表示成功; 非零值表示某種錯誤。

假設您的子進程腳本如下所示:

import sys
# Do some stuff
print 'pass'    # Gets to stdout
sys.exit(0)     # Return code

使用Popen類執行這個外部文件(讓我們稱之為test.py ),當我們讀出self.myproc.stdout時我們會pass ,當我們讀出self.myproc.poll (或者self.myproc.returncode之后)時我們會得到0 。第一次投票)。

此返回代碼的目的是您不必解析所有子進程的輸出以確定它是否在其作業中成功:您可以自由定義自己的退出代碼。 例如,你可以認為0是成功, 1是失敗, 2是某種無效輸入, 9是未知錯誤,依此類推。 這樣,您可以繼續poll該過程,並根據該輪詢返回的退出代碼直接知道它是否成功。 請注意,這有點不太適用於您的情況,因為您仍然需要子進程的輸出,但仍然更容易解析數字而不是字符串來確定成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM