Python 3での`subprocess`モジュールの活用方法
Python 3では、外部コマンドを実行するために`subprocess`モジュールを使用します。このモジュールは、シェルコマンドを実行し、その出力をキャプチャするための強力なツールです。特に複数のコマンドをパイプで接続する場合、`subprocess`モジュールは非常に便利です。この記事では、`subprocess`モジュールを使用してコマンドをパイプと共に実行する方法を具体的な例と共に紹介します。
基本的な使用方法
`subprocess`モジュールを使用してコマンドを実行する基本的な方法は`subprocess.run()`関数です。この関数は、コマンドをリストとして受け取り、実行後の結果を返します。
import subprocess # 単純なコマンドの実行 result = subprocess.run(['echo', 'Hello, World!'], capture_output=True, text=True) print(result.stdout)
この例では、`echo`コマンドを実行し、その出力をキャプチャして標準出力に表示しています。`capture_output=True`を指定することで、コマンドの出力をキャプチャし、`text=True`を指定することで出力を文字列として扱います。
パイプを使用したコマンドの実行
複数のコマンドをパイプで接続する場合、`subprocess.PIPE`を使用してプロセス間でデータを渡すことができます。以下は、`ls`コマンドの出力を`grep`でフィルタリングする例です。
# lsコマンドの出力をgrepでフィルタリング p1 = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE) p2 = subprocess.Popen(['grep', 'py'], stdin=p1.stdout, stdout=subprocess.PIPE) p1.stdout.close() # p1の出力を閉じる output = p2.communicate()[0] print(output.decode('utf-8'))
この例では、`ls -l`の出力を`grep py`でフィルタリングし、`.py`が含まれるファイルのみを表示します。`Popen`を使用してプロセスを作成し、`stdout`と`stdin`をパイプで接続しています。
エラー処理とタイムアウトの設定
コマンドの実行中にエラーが発生した場合や、特定の時間内に完了しない場合、適切に処理することが重要です。以下の例では、タイムアウトを設定し、エラーが発生した場合に例外をキャッチします。
try: # コマンドの実行にタイムアウトを設定 result = subprocess.run(['sleep', '5'], timeout=3) except subprocess.TimeoutExpired: print('コマンドがタイムアウトしました') except subprocess.CalledProcessError as e: print(f'エラーが発生しました: {e}')
このコードでは、`sleep 5`コマンドに3秒のタイムアウトを設定しています。コマンドが3秒以内に終了しない場合、`TimeoutExpired`例外が発生し、エラーメッセージが表示されます。
まとめ
Pythonの`subprocess`モジュールを使用することで、外部コマンドを効率的に実行し、パイプを介してデータを渡すことができます。これにより、複雑なシェルスクリプトをPythonで簡潔に記述することが可能です。エラー処理やタイムアウト設定を適切に行うことで、より堅牢なスクリプトを作成することができます。
Python 3 で `subprocess` モジュールを使用して外部コマンドを実行する際に、パイプを使ってコマンド間のデータの受け渡しを行うことができます。`subprocess` モジュールを使うと、Python スクリプトから外部プログラムを呼び出して実行することができます。
以下は、`subprocess` モジュールを使用してパイプを使った外部コマンドの実行方法の例です。
“`python
import subprocess# コマンド1の出力をコマンド2の入力として渡す
cmd1 = ‘ls -l’
cmd2 = ‘grep test’p1 = subprocess.Popen(cmd1.split(), stdout=subprocess.PIPE)
p2 = subprocess.Popen(cmd2.split(), stdin=p1.stdout, stdout=subprocess.PIPE)output, _ = p2.communicate()
print(output.decode(‘utf-8’))
“`この例では、`ls -l` コマンドの出力を `grep test` コマンドの入力として渡し、`grep` コマンドで`test` という文字列を含む行だけをフィルタリングしています。`subprocess.Popen` を使って各コマンドを実行し、パイプを介してデータを受け渡しています。
このように、`subprocess` モジュールを使ってパイプを使った外部コマンドの連携を行うことで、Python スクリプトからさまざまな外部プログラムを組み合わせて効率的に処理を行うことができます。