プログラムを実行しているとき、メインプロセスの実行中にサブプロセスの出力をリアルタイムで表示する必要がある場合があります。Pythonでは、これを行うためにさまざまな方法があります。本記事では、サブプロセスの出力をリアルタイムで取得する方法を、例を交えて説明します。
Pythonでサブプロセスを扱う方法
Pythonでサブプロセスを扱うための標準ライブラリとして、subprocess
モジュールがあります。このモジュールを使うことで、他のプログラムを実行し、その出力を取得することができます。
サブプロセスの基本的な実行
まずは、サブプロセスを基本的に実行してその出力を取得する方法を見てみましょう。
import subprocess result = subprocess.run(['echo', 'Hello, World!'], stdout=subprocess.PIPE, text=True) print(result.stdout)
このコードでは、echo
コマンドを実行し、その出力を取得して表示しています。しかし、この方法ではプロセスが終了するまで出力が表示されません。
リアルタイムでサブプロセスの出力を表示する
リアルタイムで出力を取得するには、subprocess.Popen
を使用します。この方法では、出力を逐次読み込んで表示することができます。
import subprocess process = subprocess.Popen(['ping', '-c', '4', 'google.com'], stdout=subprocess.PIPE, text=True) while True: output = process.stdout.readline() if output == '' and process.poll() is not None: break if output: print(output.strip())
この例では、ping
コマンドを実行し、その出力をリアルタイムで表示しています。process.stdout.readline()
で逐次出力を読み込み、print()
で表示しています。
非同期処理を使用したサブプロセスの出力表示
Python 3.5以降では、asyncio
を使うことで非同期にサブプロセスを管理し、出力をリアルタイムで取得することも可能です。
import asyncio async def run_command(command): process = await asyncio.create_subprocess_exec( *command, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE ) while True: line = await process.stdout.readline() if not line: break print(line.decode('utf-8').strip()) asyncio.run(run_command(['ping', '-c', '4', 'google.com']))
このコードは、非同期にping
コマンドを実行し、出力をリアルタイムで表示します。asyncio.create_subprocess_exec
を使うことで、非同期にプロセスを管理できます。
まとめ
サブプロセスの出力をリアルタイムで表示する方法について、subprocess
モジュールを使った方法と、asyncio
を利用した非同期処理を紹介しました。それぞれの方法には利点があり、実行するタスクや環境に応じて適切な方法を選択することが重要です。
プロセスが実行中の間、サブプロセスの出力を常に表示するとは、親プロセスがサブプロセスを生成し、そのサブプロセスが何らかの処理を行っている際に、その処理の進行状況や結果をリアルタイムで表示することを意味します。これにより、ユーザーはプロセスの進行状況を把握しやすくなり、必要に応じて適切なアクションを取ることができます。サブプロセスの出力を表示することで、プロセス全体のデバッグや監視が容易になり、効率的な作業が可能となります。