WindowsでPythonを使う場合、バッチから.pyを呼び出して使う機会は多いのではないでしょうか。
ここでは、バッチからPythonを呼び出すメリット、文字化け対策、引数の渡し方など、実際に現場で使う際に肝になりそうなことを解説します。
バッチからPythonを呼び出すメリット
バッチからPythonを呼び出すことで以下のようなメリットがあります。
- Pythonに引数を渡して処理させることができる
- 別々のPythonファイルを複数呼び出すことが簡単にできる
- タスクスケジューラへの登録が簡単になる
- 既存のバッチファイルに追記するだけでPythonで書いた処理を実行できるようになる
バッチからPythonを起動する方法
まずは単純にバッチからPythonを起動する例です。
@echo off
cd /d %~dp0
python d:\sample\hello.py
何らかの理由でWinPythonを使っていて、パスを通していないような場合は、以下のようにpython.exeのpathも含めて記述しましょう。(WinPythonの便利さについてはこの記事に書いています。)
@echo off
cd /d %~dp0
d:\WPy64-31050\scripts\python d:\sample\hello.py
バッチの文字化け対策
バッチを日本語Windows環境で実行する場合、デフォルトの文字コードはShift-JISです。このため、バッチファイルをUTF-8で保存しているような場合、そのままでは文字化けしてしまいます。
今はクロスプラットフォーム化もあり、UTF-8で保存することのほうが多いのではないでしょうか。
表示結果が文字化けするような場合は、バッチの冒頭(下記2行目)に以下のようにchcpコマンドを記述します。
@echo off
chcp 65001
cd /d %~dp0
python d:\sample\hello.py
chcpコマンドは、コマンドプロンプトで使用される文字コードを変更するものです。
ちなみにchcpコマンドでよく指定しそうな文字コードとしては以下のようなものがあります。
20127:us-ascii
51932:euc-jp
65001:utf-8
バッチから引数ありでPythonを実行する方法
バッチからPythonに引数を渡したい場合は以下のようにします。
バッチ側の記述方法
set arg1=1
set arg2=2
set arg3=3
cd /d %~dp0
python d:\sample\hello.py %arg1% %arg2% %arg3%
Python側の記述方法
下記はPython側で実際に値を受け取るときの例です。
import sys
if __name__ == "__main__":
param = sys.argv
for p in param:
print(p)
#実行結果
# 1
# 2
# 3
- sys.argvはPythonスクリプトに渡されたコマンドライン引数のリストです。
- sys.argv[0]にはスクリプト名(.py)が渡されてきます。
このため、バッチの引数を受け取るのにはsys.argv[1]以降が使われます。
if __name__ == "__main__":
setting_path = sys.argv[1]
file_name1 = sys.argv[2]
file_name2 = sys.argv[3]
「if __name__ == “__main__”:」という書き方は、そのPythonファイルが「pythonファイル名.py」という形で実行されているかどうか」を判定するためのものです。
バッチからPythonを起動したときに画面pause
上記のコードのままでは実行結果が確認できないままコマンドプロンプトが一瞬で閉じてしまいます。
このため、コマンドプロンプトを閉じずに実行結果を確認したい場合は、バッチ側に「pause」を書くのではなく、.py側でpauseしてやる必要があります。
これにはos.system(‘pause’)を使います。
Python側の記述方法
import os #冒頭に追加
#処理
os.system('pause') #末尾に追加
バッチからPythonを起動する際の引数の最大個数について
引数の数自体には制限はありませんが、コマンドラインの文字数に制限があり、それは8191文字とされているので注意が必要です。
バッチ ファイルでは、次のコマンド ラインの合計の長さが 8191 文字を超えることはできません。
https://learn.microsoft.com/ja-jp/troubleshoot/windows-client/shell-experience/command-line-string-limitationlearn.microsoft.com
Pythonおすすめの勉強方法
Pythonを最も効率的に学べる方法についてはこちらにまとめています。