リターンコードはpoll
呼び出しによって返され、returncode
属性を経由してアクセス可能(一度poll
がNone
を返しませんでした)もあります。あなたはすでにあなたのコードでこれを使用しているので、私はあなたの問題が何であるか分かりません。
プロセスの実行中にコントロールを更新する場合は、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
を呼びましょう)、および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
あなたのコメントを理解できなかったのはごめんなさい。 = 5 B = 6 C = A + B プリントC リターン 'PASS' __name__ == '__main__' であれば: メイン()この()は主DEFのような引数のために呼ばれるプロセスであります ここで返り値 'PASS'はどのように取得されますか? – user974168