Pythonのsubprocess
モジュールとcommunicate()
メソッドを使用するときに終了コードを取得するにはどうすればよいですか?
関連コード:
import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]
これを別の方法で行う必要がありますか?
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
を呼び出します。
最初に、プロセスの実行が完了し、.wait
メソッドを使用して戻りコードが読み取られたことを確認する必要があります。これはコードを返します。後でアクセスしたい場合は、Popen
オブジェクトに.returncode
として保存されます。
exitcode = data.wait()
。子プロセスが標準出力/エラーに書き込み、および/または標準入力から読み取りを行い、ピアがない場合、子プロセスはブロックされます。
.poll()
は戻りコードを更新します。
試して
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
returnCode = child.poll()
さらに、.poll()
が呼び出された後、戻りコードはchild.returncode
としてオブジェクトで使用できます。
これは私のために働いた。また、子プロセスによって返された出力を出力します
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