ホームページ > バックエンド開発 > Python チュートリアル > Python でサブプロセスの出力をリアルタイムで監視および記録するにはどうすればよいですか?

Python でサブプロセスの出力をリアルタイムで監視および記録するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-05 04:17:10
オリジナル
609 人が閲覧しました

How Can I Monitor and Log Subprocess Output in Real-Time in Python?

サブプロセス コマンドからのライブ出力のモニタリング

Python では、subprocess.Popen を使用して、入力と出力を制御しながらサブプロセスを実行できます。デフォルトでは、Popen は stdout と stderr の両方を後でアクセスできるバッファにキャプチャします。ただし、これはサブプロセスの進行状況をリアルタイムで監視するには不十分な場合があります。

出力の保存とライブ ストリーミングの同時実行

ログ用の出力を同時に保存し、ライブ ストリームでは、いくつかのアプローチを使用できます:

ファイルベースアプローチ

ロギング用のファイル オブジェクトを作成し、それを Popen の stdout 引数に渡し、同じファイルをノンブロッキング モードで読み取り用に開きます。ファイルの内容をループで監視し、コンソールとログ ファイルの両方に書き込むことができます。これにより、出力を段階的に取得できます。

with io.open("test.log", "wb") as writer, io.open("test.log", "rb", 1) as reader:
    process = subprocess.Popen(command, stdout=writer)
    while process.poll() is None:
        sys.stdout.write(reader.read())
        time.sleep(0.5)
    # Read the remaining
    sys.stdout.write(reader.read())
ログイン後にコピー

イテレータベースのアプローチ

Popen の stdout からイテレータを作成し、それを使用して両方の標準出力とログ ファイル。このアプローチは、stdout とログ ファイルの両方のバイト ストリームを扱う場合に適しています。

import subprocess
import sys

with open("test.log", "wb") as f:
    process = subprocess.Popen(your_command, stdout=subprocess.PIPE)
    # replace "" with b"" for Python 3
    for c in iter(lambda: process.stdout.read(1), ""):
        sys.stdout.buffer.write(c)
        f.buffer.write(c)
ログイン後にコピー

注: これらのアプローチでは、必要に応じてバイナリ データを明示的に処理する必要があります。 Python 3 の場合、open ステートメント内の「"」を「b」」に、「w」を「wb」に置き換えます。

以上がPython でサブプロセスの出力をリアルタイムで監視および記録するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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