2

Python の subprocess.Popen() オブジェクトに関する質問 (
stdout/stderr 用に生成されるバイト数が OS パイプ バッファーをいっぱいにせず、OS パイプ バッファーがさらにデータを受け入れるのを待つデッドロックを作成するというシナリオを想定してください)

1) p.stdout.read() と p.wait() の順序は重要ですか?

2) プロセスが終了するまで stdout/stderr subprocess.PIPE ブロックで read() を行いますか?

3) stdout/stderr subprocess.PIPE ファイルのオブジェクトとデータは、プロセスが終了した後でも利用できますか?

import subprocess
process = subprocess.Popen(args="ls", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
stdout = process.stdout.read()
# Does the above read() block until the process has terminated?
stderr = process.stderr.read()
return_code = process.wait()

process = subprocess.Popen(args="ls", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
return_code = process.wait() 
# Are stdout and stderr pipes available now, even after the process terminated?
stdout = process.stdout.read()
stderr = process.stderr.read()
4

2 に答える 2

4

Q: p.stdout.read() と p.wait() の順序は重要ですか?
A:いいえ。

Q: stdout/stderr サブプロセスの read() は、プロセスが終了するまでブロックしますか?
A: 読み取るバイト数の制限が指定されていない場合、ストリームが閉じられるまでブロックされます (プロセスが終了する可能性があります)。

Q: stdout/stderr subprocess.PIPE ファイルのオブジェクトとデータは、プロセスが終了した後でも利用できますか?
A: はい。

subprocessドキュメントからのこの警告に特に注意を払うことをお勧めします。

警告: これは、stdout=PIPEand/orstderr=PIPEを使用し、子プロセスがパイプに十分な出力を生成して、OS パイプ バッファーがさらにデータを受け入れるのを待機するのをブロックする場合にデッドロックします。communicate()それを回避するために使用します。

于 2012-07-02T00:13:07.813 に答える
0

sargeサブプロセスで I/O を実行するときに柔軟性を提供するようなライブラリの使用を検討することをお勧めします。(開示: 私はメンテナーです。あなたが抱えている問題に対応するために部分的に書きました。)

于 2012-07-02T00:17:57.603 に答える