TechNote

事務屋のおぼえがき

【Python】バッチからPythonスクリプト実行サンプル(文字化け対策、引数渡しsys.argv、画面pause、引数の最大個数など)

1.バッチからPythonを起動(文字化け対策)
2.バッチから引数ありでPythonを起動
3.バッチからPythonを起動したときに画面pause
4.バッチからPythonを起動する際の引数の最大個数について

1.バッチからPythonを起動(文字化け対策)

まずは単純にバッチから起動する例。

@echo off

cd /d %~dp0
python d:\sample\hello.py

何らかの理由でWinPythonを使っていてパスを通していないような場合はpython.exeのpathも含めて記述。

@echo off

cd /d %~dp0
d:\WPy64-31050\scripts\python d:\sample\hello.py

表示結果が文字化けするような場合は、バッチの冒頭に以下を記述。chcpコマンドは、コマンドプロンプトで使用される文字コードを変更するもの。下記ではUTF-8を指定してやっている。

@echo off

chcp 65001

cd /d %~dp0
python d:\sample\hello.py



2.バッチから引数ありでPythonを実行

バッチからPythonに引数を渡したい場合は以下のようにする。

<バッチ側>

set arg1=1
set arg2=2
set arg3=3

cd /d %~dp0
python d:\sample\hello.py %arg1% %arg2% %arg3%

Python側>

import sys

if __name__ == "__main__":
    param = sys.argv
    for p in param:
        print(p)

#実行結果
# 1
# 2
# 3

Python側で実際に値を受け取るときの例。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」という形で実行されているかどうか」を判定するためのもの。

3.バッチからPythonを起動したときに画面pause

上記のコードでは実行結果が確認できないままコマンドプロンプトが一瞬で閉じてしまう。
このためコマンドプロンプトを閉じずに実行結果を確認したい場合は、バッチ側に「pause」を書くのではなく、.py側でpauseしてやる必要がある。これにはos.system('pause')を使う。
Python側>

import os #冒頭に追加

#処理

os.system('pause') #末尾に追加

4.バッチからPythonを起動する際の引数の最大個数について

引数の数自体には制限はないが、コマンドラインの文字数に制限があり、それは8191文字とされているので注意が必要。

バッチ ファイルでは、次のコマンド ラインの合計の長さが 8191 文字を超えることはできません。

https://learn.microsoft.com/ja-jp/troubleshoot/windows-client/shell-experience/command-line-string-limitationlearn.microsoft.com