プロセスが実行中の間、サブプロセスの出力を常に表示する

PYTHON3 チュートリアル

プログラムを実行しているとき、メインプロセスの実行中にサブプロセスの出力をリアルタイムで表示する必要がある場合があります。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を利用した非同期処理を紹介しました。それぞれの方法には利点があり、実行するタスクや環境に応じて適切な方法を選択することが重要です。

プロセスが実行中の間、サブプロセスの出力を常に表示するとは、親プロセスがサブプロセスを生成し、そのサブプロセスが何らかの処理を行っている際に、その処理の進行状況や結果をリアルタイムで表示することを意味します。これにより、ユーザーはプロセスの進行状況を把握しやすくなり、必要に応じて適切なアクションを取ることができます。サブプロセスの出力を表示することで、プロセス全体のデバッグや監視が容易になり、効率的な作業が可能となります。

購読
通知
0 Comments
Inline Feedbacks
View all comments