サブプロセスからのリアルタイム出力
Python では、サブプロセス モジュールは外部プログラムを実行する便利な方法を提供します。ただし、デフォルトでは、すべてのプログラムの出力をキャプチャし、プロセスが完了するとそれを返します。これは、長時間実行されるプロセスでは問題となる可能性があります。
反復出力ポーリングの紹介
これに対処するには、iter() 関数を利用して出力を 1 行ずつ取得できます。コマンドによって生成されるとおりです。このアプローチを実装する、execute() 関数の修正バージョンを次に示します。
<code class="python">def execute(cmd): popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) for stdout_line in iter(popen.stdout.readline, ""): yield stdout_line popen.stdout.close() return_code = popen.wait() if return_code: raise subprocess.CalledProcessError(return_code, cmd)</code>
使用例
これで、プロセスの出力をそのまま反復処理できるようになります。利用可能になります:
<code class="python">for path in execute(["locate", "a"]): print(path, end="")</code>
この例では、ファイルを検索する際に、locate a コマンドの出力を継続的に出力します。
ポーリング間隔
この方法ではリアルタイムの出力が提供されますが、ポーリング間隔はパフォーマンスに影響を与える可能性があります。 universal_newlines パラメーターを使用すると、バイトではなくテキスト行が確実に取得されるため、追加のオーバーヘッドが発生します。ポーリングを最適化するには、プロセスの出力をチェックする頻度を減らすことができます。
以上がPython でサブプロセスからリアルタイム出力を取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。