[英]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.