Python 外部プロセスによってバッチ処理する「subprocess.run()」

'23/11/04更新:python3.7以上に対応したコードに刷新しました。
 本記事では、Pythonスクリプト内で、外部プロセス(子プロセス, サブプロセス)を実行したい場合の雛形コードを載せました。外部プロセスのコマンド処理の完了を待つ場合、「subprocess.run()」を使用します。標準出力やエラーを戻り値として取得できます。

■本プログラム
 下記は、複数のcsvファイルを取得した後に、それら個々のファイルに対してpythonスクリプト(ここでは便宜上sub_script.pyという任意のプログラム)を実行するプログラム例です。

import glob
import subprocess

# 複数のファイルパスをリストで取得
file_list = glob.glob('./dir_csv/*.csv')
print(file_list)

for file_path in file_list:
    print(file_path)

    # 実行したいシェルコマンドをリストで作成
    cmd_list = ['python', 'sub_script.py', file_path]
    
    # サブプロセスでコマンドを実行する
    try:
        result = subprocess.run(
            cmd_list,
            shell = False, # シェルを介して直接実行するかどうか。Trueの場合はコマンド引数をリストではなくて文字列で渡す。
            check = True, # 実行されたプロセスが正常に終了したかどうかを確認する
            capture_output = True, # 標準出力および標準エラー出力をキャプチャするかどうか
            text = True, # 標準入力(input引数)や標準出力(stdoutおよびstderr引数)がテキストとして扱われる
        )
    # 外部プロセスでエラーが生じた場合に、その内容を表示する
    except subprocess.CalledProcessError as e:
        print(f"Error: Command '{e.cmd}' returned non-zero exit status {e.returncode}")
        print(f"Output: {e.stdout}")
        print(f"Error Output: {e.stderr}")

一方、コマンド処理を待たずに処理を続行したい場合はPopenを使用します。

 subprocess.Popen() 

 この場合、サブプロセス(子プロセス)として残ります。終了させるには後のPythonコードで終了させるか、手動で終了させる必要があります。

そうでもなく、単にシェルコマンドを実行させたいだけの場合は、次のようにします。

 subprocess.call() 

(参考)引数に辞書型を渡したい場合には、一度JSON形式の文字列へ変換します。雛形コードは下記を参照ください。

hk29.hatenablog.jp

以上

<広告>