標準ライブラリ|「SubProcess」の使い方・サンプルコード

Python

インストール方法

subprocessは、Pythonの標準ライブラリの一部であり、外部プログラムやシェルコマンドを実行するためのモジュールです。特別なインストールは必要なく、Pythonがインストールされていればすぐに使用できます。以下に、subprocessを使うための基本的な手順を説明します。

1. Pythonのインストール

まず、Pythonがインストールされている必要があります。Pythonは公式サイトからダウンロードできます。

Pythonのバージョンは3.x系を推奨します。

2. subprocessモジュールのインポート

subprocessモジュールは標準ライブラリの一部なので、特別なインストールは不要です。使用する際は、以下のようにインポートします。

import subprocess

これで、subprocessモジュールを使って外部コマンドを実行する準備が整いました。

できること

subprocessモジュールを使用することで、さまざまな外部プロセスを管理することができます。主な機能は以下の通りです。

  1. 外部コマンドの実行:
  • シェルコマンドや他のプログラムを実行し、その結果を取得することができます。
  1. 標準入力・出力・エラーの管理:
  • 実行したコマンドの標準入力、標準出力、標準エラーを管理し、必要に応じてリダイレクトすることができます。
  1. プロセスの管理:
  • プロセスの実行時間を計測したり、実行中のプロセスを終了させることができます。
  1. 非同期処理:
  • プロセスを非同期に実行し、メインスレッドをブロックせずに他の処理を続けることができます。
  1. エラーハンドリング:
  • コマンドの実行結果やエラーを捕捉し、適切に処理することができます。

関数一覧

Pythonの標準ライブラリ「subprocess」には、外部プログラムやシェルコマンドを実行するためのさまざまな関数があります。以下に主な関数の一覧を示します。

主な関数一覧

  1. subprocess.run()
    • 外部コマンドを実行し、完了まで待機します。
    • 戻り値としてCompletedProcessオブジェクトを返します。
  2. subprocess.Popen()
    • 新しいプロセスを生成します。非同期で実行でき、プロセスの標準入出力を管理できます。
    • プロセスの詳細な制御が可能です。
  3. subprocess.call()
    • 指定したコマンドを実行し、終了コードを返します。
    • subprocess.run()の簡易版で、戻り値は終了ステータスのみです。
  4. subprocess.check_call()
    • コマンドを実行し、成功した場合は終了コードを返します。失敗した場合はCalledProcessErrorを発生させます。
  5. subprocess.check_output()
    • コマンドを実行し、その標準出力を返します。失敗した場合はCalledProcessErrorを発生させます。
  6. subprocess.getoutput()
    • コマンドを実行し、その標準出力を文字列として返します。Python 3.5以降で使用可能です。
  7. subprocess.getstatusoutput()
    • コマンドを実行し、終了ステータスと標準出力をタプルとして返します。Python 3.5以降で使用可能です。

Popenオブジェクトのメソッド

subprocess.Popenを使用する際には、以下のメソッドも利用できます。

  • Popen.communicate(input=None)
    • プロセスとの対話を行い、標準入力にデータを送信し、標準出力と標準エラーを取得します。
  • Popen.wait(timeout=None)
    • プロセスが終了するまで待機します。オプションでタイムアウトを指定できます。
  • Popen.poll()
    • プロセスの終了状態を確認し、終了していない場合はNoneを返します。
  • Popen.terminate()
    • プロセスを終了します。
  • Popen.kill()
    • プロセスを強制終了します。

これらの関数を使用することで、Pythonから外部プログラムやシェルコマンドを実行し、その出力やエラーを管理することができます。詳細な使い方やオプションについては、Python公式ドキュメントのsubprocessモジュールを参照してください。

サンプルコード

以下に、subprocessを使用した基本的なサンプルコードを示します。この例では、システムのlsコマンドを実行して、ディレクトリの内容を表示します。

サンプルコード:lsコマンドを実行してディレクトリの内容を表示

import subprocess

# 外部コマンドを実行
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)

# 結果の表示
if result.returncode == 0:
    print("コマンドの実行に成功しました。")
    print("標準出力:")
    print(result.stdout)
else:
    print("コマンドの実行に失敗しました。")
    print("標準エラー:")
    print(result.stderr)

コードの説明

  1. subprocessモジュールのインポート:
  • import subprocesssubprocessモジュールをインポートします。
  1. コマンドの実行:
  • subprocess.run()を使用して、ls -lコマンドを実行します。引数にはコマンドとそのオプションをリスト形式で指定します。
  • capture_output=Trueを指定することで、コマンドの出力をキャプチャします。
  • text=Trueを指定することで、出力をバイナリ形式ではなく文字列として取得します。
  1. 結果の確認:
  • result.returncodeを確認して、コマンドが成功したかどうかを判断します。0の場合は成功、0以外はエラーを示します。
  1. 出力の表示:
  • コマンドが成功した場合は、標準出力(result.stdout)を表示します。失敗した場合は、標準エラー(result.stderr)を表示します。

もう一つのサンプルコード

次に、PythonからPythonスクリプトを実行する例を示します。この例では、別のPythonスクリプトを呼び出し、その結果を取得します。

サンプルコード:別のPythonスクリプトを実行

まず、hello.pyというファイルを作成します。

# hello.py
print("Hello from the hello.py script!")

次に、メインのスクリプトでこのスクリプトを実行します。

import subprocess

# hello.pyを実行
result = subprocess.run(['python', 'hello.py'], capture_output=True, text=True)

# 結果の表示
if result.returncode == 0:
    print("コマンドの実行に成功しました。")
    print("標準出力:")
    print(result.stdout)
else:
    print("コマンドの実行に失敗しました。")
    print("標準エラー:")
    print(result.stderr)

コードの説明

  1. 別スクリプトの実行:
  • subprocess.run(['python', 'hello.py'], ...)を使用して、hello.pyスクリプトを実行します。
  1. 出力の取得と表示:
  • 実行結果を標準出力として取得し、成功した場合はその内容を表示します。失敗した場合はエラーメッセージを表示します。

まとめ

subprocessモジュールは、Pythonから外部プログラムやシェルコマンドを実行するための非常に強力なツールです。標準ライブラリの一部であるため、特別なインストールは不要で、簡単に利用できる点が魅力です。

このモジュールを使用することで、Pythonプログラムから他のアプリケーションを呼び出したり、システムコマンドを実行して結果を取得したりすることができます。これにより、さまざまな自動化タスクやデータ処理を効率化することが可能です。

subprocessを活用することで、スクリプトを組み合わせて複雑な処理を行ったり、外部ツールとの連携を図ったりすることができます。また、エラーハンドリングや出力の管理が容易なため、信頼性の高いプログラムを構築するのにも役立ちます。

ただし、外部コマンドの実行には注意が必要です。特に、ユーザーからの入力をそのままコマンドに渡す場合は、セキュリティリスクがあるため、適切なバリデーションを行うことが重要です。

Pythonのsubprocessモジュールを利用することで、より効率的なプログラムを作成し、さまざまな自動化の可能性を広げることができるでしょう。興味がある方は、ぜひこのモジュールを使ってみてください。

このライブラリの他にも標準ライブラリの記事も書いています。
ぜひ、見てみてください。

コメント

タイトルとURLをコピーしました