Pythonサブプロセス通信メソッドを使用しているときに終了コードを取得するにはどうすればよいですか?


186

Pythonのsubprocessモジュールとcommunicate()メソッドを使用するときに終了コードを取得するにはどうすればよいですか?

関連コード:

import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]

これを別の方法で行う必要がありますか?

回答:


266

Popen.communicatereturncode完了時に属性を設定します(*)。関連するドキュメントセクションは次のとおりです。

Popen.returncode 
  The child return code, set by poll() and wait() (and indirectly by communicate()). 
  A None value indicates that the process hasnt terminated yet.

  A negative value -N indicates that the child was terminated by signal N (Unix only).

だからあなたはちょうどすることができます(私はそれをテストしませんでしたが、うまくいくはずです):

import subprocess as sp
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
streamdata = child.communicate()[0]
rc = child.returncode

(*)これは、その実装方法が原因で発生します。子のストリームを読み取るようにスレッドを設定した後、それは呼び出すだけです wait


34
この例は私に役立ちましたが、例が標準を不明瞭な略語としてインポートする「spとしてのサブプロセスのインポート」パターンを実行しなかった場合は、すばらしいでしょう。これにより、それに続くコードから8文字が削除されますが、理解と再利用が難しくなります。
uglycoyote 2016年

16
@uglycoyoteコピーして貼り付ける必要があるというルールはありません。好きなように入力し直してください。まるで4行のようなものです。
Jason C

5
@uglycoyoteを編集して次のようにすることもできfrom subprocess import Popenます。Popen代わりに、subprocess(or sp).Popenおそらく読みやすさが向上し、行が短くなります
Mitch

2
ええ...呼び出してprocess.communicate()から、returncodeいくつかの変数に割り当てる必要があります。を呼び出す前に割り当てを行う場合はcommunicate、ですNone
WesternGun 2017

1
パイプをリダイレクトせずに戻りコードを表示することは可能ですか?私はbashコードを呼び出しており、ターミナルで出力をリアルタイムで確認したい
Nisba

10

まず、プロセスの実行が完了し、.waitメソッドを使用して戻りコードが読み取られていることを確認する必要があります。これはコードを返します。後でアクセスしたい場合.returncodeは、Popenオブジェクトと同じように保存されます。


24
.communicate()サブプロセスが終了するのをすでに待機しています。
メカニカルカタツムリ

8

.poll() 戻りコードを更新します。

試す

child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
returnCode = child.poll()

さらに、.poll()が呼び出された後、戻りコードはとしてオブジェクトで使用できますchild.returncode


私がこれをしたとき、.poll()は空でした。これを機能させるには、child.poll()の上の行でchild.communicate()を実行する必要がありました。
NateW 2018

1
ドキュメント:docs.python.org/3/library/subprocess.htmlのように、.poll()ではなく.wait()を使用するつもりだったと思います。.wait()は、便利なオプションのタイムアウトパラメータを取ることに注意してください。
gg99

7

exitcode = data.wait()。子プロセスが標準出力/エラーに書き込み、および/または標準入力から読み取り、ピアがない場合、ブロックされます。


1

これでうまくいきました。子プロセスから返された出力も出力します

child = subprocess.Popen(serial_script_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    retValRunJobsSerialScript = 0
    for line in child.stdout.readlines():
        child.wait()
        print line           
    retValRunJobsSerialScript= child.returncode
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.