Python プログラミングでは、外部コマンドからの出力をキャプチャして処理する機能が重要です。一般的なシナリオの 1 つは、サブプロセス モジュールを使用してコマンドを実行し、その出力を取得することです。ただし、出力が大量になると問題が発生し、出力を段階的にフィルターして表示する必要があります。
大量の出力を生成するユーティリティを呼び出す次の Python スクリプトを考えてみましょう。 :
import time i = 0 while True: print(hex(i)*512) i += 1 time.sleep(0.5)
親プロセスでは、 Output:
import subprocess proc = subprocess.Popen(['python', 'fake_utility.py'], stdout=subprocess.PIPE) for line in proc.stdout: # perform filtering logic print("test:", line.rstrip())
当初、ユーティリティからの出力は、利用可能になると 1 行ずつ表示されることが期待されていました。しかし、これは起こりませんでした。
この遅延の理由は、proc.stdout に対する for ループの使用にあります。これにより、繰り返し処理する前に、出力全体が暗黙的にメモリに読み込まれます。この問題を解決するには、より効率的な方法を採用できます。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 logic print "test:", line.rstrip()
このアプローチにより、出力が利用可能になったときに出力を 1 行ずつ読み取ることができるため、遅延がなくなり、より多くの出力が得られます。応答性の高いフィルター プロセス。
サブプロセスからの出力のフィルター処理は、Python の一般的なタスクです。 I/O バッファリングの微妙な違いを理解し、readline() などの効率的な手法を採用することで、開発者はデータを段階的に処理および表示するノンブロッキング フィルターを実装し、アプリケーションの応答性を向上させることができます。
以上がPython でサブプロセスからノンブロッキングの行ごとの出力フィルタリングを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。