アプリの出力が少量の場合は正常に動作するが、出力が多い場合はハングする外部アプリを実行する Python コードがいくつかあります。私のコードは次のようになります:
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
errcode = p.wait()
retval = p.stdout.read()
errmess = p.stderr.read()
if errcode:
log.error('cmd failed <%s>: %s' % (errcode,errmess))
ドキュメントには、潜在的な問題を示していると思われるコメントがあります。待機中は、次のとおりです。
警告: 子プロセスが
stdout
またはstderr
パイプに十分な出力を生成し、OS パイプ バッファーがさらにデータを受け入れるのを待機するのをブロックする場合、これはデッドロックになります。communicate()
それを回避するために使用します。
通信中ですが、次のように表示されます。
注 読み取ったデータはメモリにバッファリングされるため、データ サイズが大きい場合や無制限の場合は、このメソッドを使用しないでください。
したがって、大量のデータがある場合、これらのいずれかを使用する必要があるかどうかは不明です。その場合にどの方法を使用すべきかは示していません。
exec からの戻り値が必要であり、 と の両方を解析して使用しstdout
ますstderr
。
では、大きな出力を持つ外部アプリを実行するための Python での同等の方法は何でしょうか?