Python では、サブプロセス モジュールはシステム コマンドと対話するための強力な方法を提供します。ただし、大量の出力を生成するノイズの多いコマンドを扱う場合、この出力を効率的にキャプチャして 1 行ずつ表示することが困難になることがあります。
一般的なアプローチの 1 つは、proc.stdout で for 行を使用することです。サブプロセスの出力を読み取るイテレータ。ただし、質問で強調されているように、このアプローチではバッファリングが発生し、出力の表示が遅れる可能性があります。
このバッファリングの問題を解決するには、解決策は、proc.stdout オブジェクトの readline() メソッドを利用することです。このメソッドを使用すると、サブプロセスの出力が利用可能になったときに、その出力を 1 行ずつ読み取ることができます。以下は、readline() アプローチを組み込んだ更新されたコード スニペットです:
import subprocess proc = subprocess.Popen(['python', 'fake_utility.py'], stdout=subprocess.PIPE) while True: line = proc.stdout.readline() if not line: break # Perform filtering or other operations on the line as needed print("test:", line.rstrip())
この変更されたスクリプトでは、readline() を使用してサブプロセスの stdout を繰り返し読み取る連続ループに入ります。利用可能な出力がある限り、ループは継続し、受信した各行を出力します。これにより、出力がブロックされずに表示され、リアルタイムの更新がユーザーに提供されるようになります。
このソリューションには潜在的な可能性の余地がまだ残されていることに注意することが重要です。サブプロセスの構成に応じてバッファリングの問題が発生します。たとえば、サブプロセスの出力が大量にバッファリングされている場合でも、ある程度の遅延は避けられない可能性があります。これに対処するには、サブプロセスのバッファリング設定を調整するか、出力バッファを手動でフラッシュするなどの追加の戦略を採用する必要がある場合があります。
以上がPython でサブプロセスから非ブロッキング出力をキャプチャするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。