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

Python でサブプロセス出力を 1 行ずつストリーミングするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-16 06:27:17421ブラウズ

How Can I Stream Subprocess Output Line by Line in Python?

subprocess.communicate() からのストリーミング出力

Python の subprocess.communicate() 関数は、プロセスの stdout をキャプチャするのに役立ちます。ただし、通常はすべての出力を一度に返します。これは、長期間にわたって出力を生成するプロセスにとっては不都合な場合があります。これに対処するために、プロセスの標準出力の各行をストリーミング形式で出力する手法を検討します。

解決策

反復メカニズムを採用することで、行を取得できます。 stdout になるとすぐにavailable:

from subprocess import Popen, PIPE

# Launch a process with buffering set to 1 byte
p = Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1)

# Iterate over the stdout lines as they become available
with p.stdout:
    for line in iter(p.stdout.readline, b''):
        print(line, end='')

# Wait for the process to terminate
p.wait()

説明

  • iter(p.stdout.readline, b''): これは、p から行を継続的に読み取る反復子を作成します。
  • end='': これにより、各行が必ず印刷されます。末尾の改行文字。
  • p.wait(): イテレータが使い果たされると、この関数はプロセスが終了するのを待ってから続行します。

補足事項

  • Python 2 の場合、先読みを回避するには iter() が必要ですバグ。
  • Python 3 の場合、universal_newlines オプションは stdout を自動的にテキストにデコードします。
  • Pexpect やバッファなしユーティリティなどの代替メソッドを使用して、バッファなし stdout を強制することもできます。

以上がPython でサブプロセス出力を 1 行ずつストリーミングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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