1

私は次のことをしたいと思います:

  • を使用して、Python から別の実行可能ファイルにシェルアウトします。subprocess.check_call
  • 子プロセスの stderr をキャッチします (存在する場合)
  • 親プロセスからの CalledProcessError 例外出力に stderr 出力を追加します。

理論的には、これは簡単です。check_call関数シグネチャには、次の kwarg が含まれていstderrます。

subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

ただし、そのすぐ下のドキュメントには次の警告が含まれています。

:この関数と一緒にstdout=PIPEorを使用しないでください。stderr=PIPEパイプは現在のプロセスで読み取られていないため、OS パイプ バッファーをいっぱいにするのに十分な出力をパイプに生成すると、子プロセスがブロックされる可能性があります。

問題は、子プロセスから stderr を取得するために見つけることができるほとんどすべての例が、subprocess.PIPEその出力をキャプチャするために使用することを言及していることです。

を使用せずに子プロセスから stderr をキャプチャするにはどうすればよいですsubprocess.PIPEか?

4

1 に答える 1

3

stdoutファイルハンドルのようなデータをstderr受け取ることができるほとんどすべてのものに割り当てることができます。stdoutおよびへの書き込み用に開いている file_handle を指定することもできますstderr

file_handle = open('some_file', 'w')

subprocess.check_call(args, *, stdin=None, stdout=file_handle, stderr=file_handle, shell=False)

出力のすべての行が同じファイルに送られるようになりました。または、それぞれに異なるファイルを作成することもできます。

stdinもファイルハンドルのように読み取ります。next()最初の に加えて送信される入力コマンドとして各行を読み取るために を使用しargsます。

その非常に堅牢な機能。

于 2012-12-30T08:51:28.923 に答える