Pythonのsubprocessを使い外部コマンドを実行する方法

コンピュータ

Windows環境でPythonスクリプトから、実行ファイル(.exe)を実行するサンプルコードを作成しました。
GUIアプリは単純に起動するぐらいの使い道しか思いつきませんが、CLIの外部コマンドの場合、コンソールへ出力される文字列を標準出力としてPythonスクリプト側でキャプチャし利用することが出来ます。この機能を使うことでスクリプト単体では難しい処理を外部コマンドの力を借りて機能拡張を実現することが出来ます。

notepad.exe を起動し、すぐ制御を戻す

import subprocess

# notepad.exe をバックグラウンドで起動(制御をすぐ戻す)
proc = subprocess.Popen(["notepad.exe"])
print("Notepad を起動しました。PID:", proc.pid)
  1. Popen を使うと制御が即座に戻ります。
  2. proc オブジェクトから PID や終了コードを取得可能です。

notepad.exe を起動し、終了を待つ

import subprocess

# notepad.exe を起動して終了を待つ
ret = subprocess.run(["notepad.exe"])
print("終了コード:", ret.returncode)
  1. subprocess.run() はプロセスが終了するまで待機します。
  2. returncode が 0 なら正常終了です。

CLI コマンドを実行し、戻り値と標準出力・標準エラーを取得

import subprocess

# 例: dir コマンドを実行(Windows の場合)
result = subprocess.run(
    ["cmd", "/c", "dir"],  # Windows の CLI コマンド実行
    capture_output=True,   # stdout, stderr を取得
    text=True              # バイト列ではなく文字列で受け取る
)

print("終了コード:", result.returncode)

print("標準出力:")
print(result.stdout)

print("標準エラー:")
print(result.stderr)
  1. capture_output=True で標準出力・標準エラーをキャプチャできます。
  2. text=True を指定すると文字列で扱えます。
  3. returncode == 0 なら成功、それ以外は失敗です。

捕捉

サンプルコードでは、環境変数のパスが切られていることが前提でディレクトリを省略しファイル名だけを指定しています。うまく動作しない場合、実行ファイルのフルパスを指定すると動作する場合が考えられます。(フルパスは実行環境によって異なります)

参考

subprocessで出来ること

  1. プロセスを非同期で動かせる(Popen)
  2. 終了を待てる(run)
  3. 出力を変数にキャプチャできる(capture_output)
  4. 失敗を例外で検出できる(check=True)
  5. タイムアウトできる(timeout=秒数)
  6. リアルタイムにログを読み取れる(Popen + PIPE)

コメント