[Python] Pythonからバッチファイルを起動、変数を渡す。


バッチファイルとは

Windowsで実行される一連のコマンド群を記述したファイルです。
バッチファイルには「.bat」と「.cmd」の拡張子の二種類がありますが、動作は基本的に同じです。この違いについて詳しく知りたい方は以下の記事を参照ください。
.cmd(拡張子)とは

なぜこの機能が必要?

単純にバッチコマンドを学習するのがめんどくさかったからです。
Python側で処理してしまって、その結果をバッチファイルの引数として渡すほうが楽でした。
いろんなライブラリ使えますし...(言い訳)

Python側の用意

os.system()関数の引数に、.cmdファイルのパスとコマンドライン引数を記述するだけで、指定した.cmdファイルへ処理を受け渡すことができます。

sys.argvで引数のリストを受け取ることができますが、起動したPythonファイル名がリストの一番初めに含まれるため、これを除外してインデックス1からforループをまわします。

fuga.py
import os
import sys

cmd_file = "hoge.cmd"   # .cmdファイルへのパス
argvs = sys.argv        # 複数の引数を持つ場合
argc = len(argvs)

command = cmd_file

for i in range(1, argc):
    command += " " + argvs[i]

os.system(command)

cmdファイル側の用意

コマンドライン引数をすべて出力するコマンドを記述し、正しい値が取得できているか確認します。

hoge.cmd
@echo off

echo ".cmd Executed"

for %%f in (%*) do (
  echo %%f
)

echo "Completed"

結果

コマンドプロンプトで、先程作成したPythonファイルを引数つきで呼び出します。

Python側に指定した引数が、.cmdの引数として使用できました。