web-dev-qa-db-ja.com

Pythonサブプロセス通信メソッドを使用するときに終了コードを取得する方法は?

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

関連コード:

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

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

163
CarpeNoctem

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

Popen.returncode 
  The child return code, set by poll() and wait() (and indirectly by communicate()). 
  A None value indicates that the process hasn’t 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を呼び出します。

229
Eli Bendersky

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

8
Noufal Ibrahim

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

6
khachik

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

試して

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

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

2
Matthew Vernon

これは私のために働いた。また、子プロセスによって返された出力を出力します

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
1
Chinni Mahesh