ホームページ >バックエンド開発 >Python チュートリアル >Python を使用してサブプロセス出力をリアルタイムでストリーミングするにはどうすればよいですか?

Python を使用してサブプロセス出力をリアルタイムでストリーミングするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-15 05:56:09442ブラウズ

How Can I Stream Subprocess Output in Real-Time Using Python?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。