ホームページ > バックエンド開発 > Python チュートリアル > Python でサブプロセスからノンブロッキングの行ごとの出力フィルタリングを実現するにはどうすればよいですか?

Python でサブプロセスからノンブロッキングの行ごとの出力フィルタリングを実現するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-10 14:09:10
オリジナル
317 人が閲覧しました

How Can I Achieve Non-Blocking Line-by-Line Output Filtering from Subprocesses in Python?

サブプロセスからのノンブロッキング出力フィルタリング: 行ごとのアプローチ

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 サイトの他の関連記事を参照してください。

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