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

Python でサブプロセスから非ブロッキング出力をキャプチャするにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-02 13:18:38
オリジナル
750 人が閲覧しました

How Can I Capture Non-Blocking Output from Subprocesses in Python?

サブプロセスからのノンブロッキング出力キャプチャについて

Python では、サブプロセス モジュールはシステム コマンドと対話するための強力な方法を提供します。ただし、大量の出力を生成するノイズの多いコマンドを扱う場合、この出力を効率的にキャプチャして 1 行ずつ表示することが困難になることがあります。

一般的なアプローチの 1 つは、proc.stdout で for 行を使用することです。サブプロセスの出力を読み取るイテレータ。ただし、質問で強調されているように、このアプローチではバッファリングが発生し、出力の表示が遅れる可能性があります。

ノンブロッキング出力に readline() を利用する

このバッファリングの問題を解決するには、解決策は、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート