サブプロセス コマンドからのライブ出力のモニタリング
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 サイトの他の関連記事を参照してください。