## Python 3でSubprocessの標準出力を行ごとに読む方法
Pythonの`subprocess`モジュールは、外部プログラムを実行し、その出力を扱うための強力なツールです。本記事では、Python 3を使用して、`subprocess`の標準出力を行ごとに読み取る方法について解説します。具体的なサンプルコードとその出力を示しながら、ステップバイステップで進めていきます。
基本設定とsubprocessの導入
`subprocess`モジュールを使用するためには、まずPythonスクリプトにインポートする必要があります。以下に基本的なインポート方法を示します。
import subprocess
サンプルコード1: 簡単なコマンドの実行
まずは、シンプルなコマンドを実行し、その標準出力を行ごとに読み取る方法を見てみましょう。この例では、`ls`コマンドを使用して、現在のディレクトリ内のファイルを一覧表示します。
import subprocess process = subprocess.Popen(['ls'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) for line in process.stdout: print(line.strip())
このコードは、シェルの`ls`コマンドを実行し、その出力を行ごとに読み取って表示します。`text=True`を指定することで、出力がテキスト形式で読み取られます。
標準出力と標準エラーの同時取得
次に、標準出力と標準エラーの両方を同時に取得する方法を見ていきます。これは、外部プログラムがエラーを出力する可能性がある場合に便利です。
サンプルコード2: 標準出力と標準エラーの取得
import subprocess process = subprocess.Popen(['ls', 'non_existent_directory'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) stdout, stderr = process.communicate() if stdout: print("Standard Output:") for line in stdout.splitlines(): print(line) if stderr: print("Standard Error:") for line in stderr.splitlines(): print(line)
このコードでは、存在しないディレクトリを指定して`ls`コマンドを実行しています。そのため、標準エラーにエラーメッセージが出力されます。`communicate()`メソッドを使用して、プロセスの完了を待ち、出力を取得しています。
リアルタイムでの標準出力の読み取り
最後に、プロセスが実行中にリアルタイムで標準出力を読み取る方法を紹介します。これは、長時間実行されるプロセスの進捗を監視するのに役立ちます。
サンプルコード3: リアルタイムでの出力読み取り
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`コマンドを使用して、Googleのサーバーに対して4回のパケットを送信します。`readline()`メソッドを使用して、各行の出力をリアルタイムで読み取ります。プロセスの終了を確認するために、`poll()`メソッドを使用しています。
以上が、Python 3における`subprocess`モジュールを用いた標準出力の行ごとの読み取り方法です。これらの方法を駆使することで、外部プログラムの出力を効率的に扱うことができます。
Python 3のsubprocessモジュールを使用して外部プロセスを実行する際、そのプロセスの標準出力を行ごとに読み取る方法があります。subprocessモジュールのPopen関数を使用して外部プロセスを起動し、そのプロセスの標準出力をリアルタイムで読み取ることができます。
以下は、Python 3でsubprocessの標準出力を行ごとに読むための基本的なコード例です。
“`python
import subprocess# 外部プロセスを起動して標準出力をリアルタイムで読み取る
process = subprocess.Popen([‘command’, ‘arg1’, ‘arg2’], stdout=subprocess.PIPE)
for line in process.stdout:
print(line.decode().strip())
“`このコードでは、`subprocess.Popen`関数を使用して外部プロセスを起動し、その標準出力をリアルタイムで読み取っています。`process.stdout`は外部プロセスの標準出力ストリームを表し、`for`ループを使用して行ごとに読み取り、`decode().strip()`メソッドを使ってバイト列を文字列に変換しています。
このようにして、Python 3でsubprocessの標準出力を行ごとに読むことができます。