2011-11-09 22 views
8

出力(print文)を取得し、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呼び出しによって返され、returncode属性を経由してアクセス可能(一度pollNoneを返しませんでした)もあります。あなたはすでにあなたのコードでこれを使用しているので、私はあなたの問題が何であるか分かりません。

プロセスの実行中にコントロールを更新する場合は、readの代わりにreadlineを使用します。後者は改行文字を待つ間に出力全体が存在するのを待ちます。あなたは.strip()には改行文字が含まれていますようreadline結果をお勧めします

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) 

注:あなたの変数名を使用して完全な例を与えるために。

編集:スクリプトの出力とその戻りコードの混乱を解決するには、次のようにします。まず、モジュールレベルのPythonスクリプトは値を返すことができません:それは構文エラーをもたらすでしょう。したがって、スクリプトの出力とそれが与える戻りコードが区別される必要があります。

スクリプトの出力は、上記の例では、self.myproc.stdout.readlineメソッドを使用して読み取られます。外部プロセスが出力されたテキストの行を生成するたびに、その関数を呼び出すとその行が検索されます。

ただし、リターンコード(または終了ステータス)は、子プロセスから親プロセスへ渡される整数で、子プロセスが終了した状態を示します。 Pythonでは、sys.exit関数でこれを行います。最も一般的には、この値がゼロのときは成功を示します。ゼロ以外の値は何らかのエラーを示します。

があなたの子プロセスのスクリプトは次のようになります言う:私たちが読んだとき、この外部ファイルを実行

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

我々はself.myproc.stdoutを読み出す際に、我々はpassを取得しますPopenクラスで(のはそれtest.pyを呼びましょう)、および0self.myproc.poll(または最初のポーリング後にself.myproc.returncode)。

この戻りコードの目的は、子プロセスのすべての出力を解析して、ジョブに成功したかどうかを判断する必要がないことです。独自の終了コードを自由に定義できます。たとえば、0は成功、1は失敗、2は何らかの無効な入力、9は不明なエラーなどと考えることができます。このようにして、プロセスを終了させるだけでpollを保つことができ、そのポーリングによって返された終了コードに基づいて、成功したかどうかを直接知ることができます。とにかく子プロセスの出力を必要とするため、これはあなたのケースにはあまり適用されませんが、成功を判定するために文字列よりも数値を解析する方が簡単です。

+0

私のプロセス内のコマンドはPythonファイルであり、たとえば 'Pass'や 'Fail'のような文字列を返します。私はちょうど0か1のような戻り値を得ていた。 – user974168

+0

ああ、あなたは 'stdout'の最後の行を解析する必要があります。戻りコードは、プログラムの終了条件を示すもので、整数です。 – jro

+0

あなたのコメントを理解できなかったのはごめんなさい。 = 5 B = 6 C = A + B プリントC リターン 'PASS' __name__ == '__main__' であれば: メイン()この()は主DEFのような引数のために呼ばれるプロセスであります ここで返り値 'PASS'はどのように取得されますか? – user974168