重複の可能性:
サブプロセスの stdout/stderr をラップする
この質問で、hanan-nは、後で処理するために出力を文字列に保持しながら、stdout に出力する Python サブプロセスを持つことが可能かどうかを尋ねました。この場合の解決策は、すべての出力行をループして手動で出力することでした。
output = []
p = subprocess.Popen(["the", "command"], stdout=subprocess.PIPE)
for line in iter(p.stdout.readline, ''):
print(line)
output.append(line)
ただし、この解決策は、以下を満たしながら、stdout と stderr の両方に対してこれを実行したい場合には一般化されません。
- stdout/stderr からの出力は、親プロセスの stdout/stderr にそれぞれ移動する必要があります。
- 出力は可能な限りリアルタイムで行う必要があります (ただし、最後に文字列にアクセスする必要があるだけです)。
- stdout 行と stderr 行の間の順序を変更するべきではありません (サブプロセスが stdout キャッシュと stderr キャッシュを異なる間隔でフラッシュする場合でも、それがどのように機能するかはよくわかりません。今のところ、full を含む適切なチャンクですべてを取得すると仮定しましょう。行?)
サブプロセスのドキュメントを調べましたが、これを達成できるものは見つかりませんでした。私が見つけた最も近い方法はstderr=subprocess.stdout
、上記と同じソリューションを追加して使用することですが、通常の出力とエラーの区別が失われます。何か案は?解決策があるとすれば、 と への非同期読み取りが必要になると思いp.stdout
ますp.stderr
。
これが私がやりたいことの例です:
p = subprocess.Popen(["the", "command"])
p.wait() # while p runs, the command's stdout and stderr should behave as usual
p_stdout = p.stdout.read() # unfortunately, this will return '' unless you use subprocess.PIPE
p_stderr = p.stderr.read() # ditto
[do something with p_stdout and p_stderr]