Subprocess.communicate() からの出力のストリーミング
subprocess.communicate() を使用してプロセスから出力を取得する場合、標準出力 (stdout) が一度に返されるため、出力のリアルタイム監視が妨げられる場合があります。この問題は、communicator() 関数のブロック特性が原因で発生します。
これに対処するには、stdout の各行が利用可能になったときに出力するストリーミング アプローチを採用できます。これは、イテレータを使用し、Popen() の bufsize パラメータを操作することで実現できます。
Python 2 では:
from subprocess import Popen, PIPE p = Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1) with p.stdout: for line in iter(p.stdout.readline, b''): print(line) p.wait()
Python 3 では、コードは次のようになります:
from subprocess import Popen, PIPE with Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1, universal_newlines=True) as p: for line in p.stdout: print(line, end='')
bufsize=1 パラメータは、各行の後にプロセスに出力バッファをフラッシュさせ、各行が確実に出力されるようにします。 すぐに。 iter() を使用すると、行を非同期で読み取ることができるため、出力をストリーミングできるようになります。プロセスの終了は wait() メソッドで処理されます。
このストリーミング アプローチを使用すると、communicator() 関数の同期性を損なうことなく、長時間実行プロセスの出力をリアルタイムで監視できます。
以上がPython を使用してサブプロセス出力をリアルタイムでストリーミングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。