結論
-
文字化けして実行できない時
→ 文字コードを【SHIFT-JIS】にする -
改行がなんか変な時
→ 改行コードを【CRLF】にする
バッチファイルを書き始める前に、以上の2点を確認することをお勧めします。(後で直すと少し面倒くさいです…)
文字化けして実行できない時
下のようなフォルダ名に日本語を含む階層構造でプログラムを用意し、バッチファイルからPythonのコード動かしてみます。
C:\プロジェクト
|-プログラム
| |-hello.py
|-pyexe.bat
print("hello")
python C:/自動実行/プログラム/hello.py
それでは、ターミナルを開き実行してみましょう。
$ C:\プロジェクト>pyexe.bat
$ C:\プロジェクト>python C:/繝励Ο繧ク繧ァ繧ッ繝・繝励Ο繧ー繝ゥ繝/hello.py
python: can't open file 'C:\\繝励Ο繧ク繧ァ繧ッ繝・繝励Ο繧ー繝ゥ繝\uf8f0\\hello.py': [Errno 2] No such file or directory
完璧に文字化けしてしまっていますね。。。
実行結果の一行目からバッチファイルが読み込めていることはわかります。
原因
これは文字コードが【UTF-8】になっていることが原因です。
パスに日本語が含まれる場合は、文字コードを【SHIFT-JIS】に変更する必要があります。
対処法
VSCodeであれば、ステータスバーからクリックで簡単に変更できます。
右下のエンコードの選択(赤丸で囲ってある箇所)のUTF-8
をクリック
下図のようにエンコードの選択が出てくると思いますので、Japanese (Shift JIS)
を選択します。
すると今度はバッチファイルの中身が文字化けするかと思います。
python C:/繝励Ο繧ク繧ァ繧ッ繝�/繝励Ο繧ー繝ゥ繝�/hello.py
ですので面倒ですが、パスを正しく書き換えてあげてください。
python C:/プロジェクト/プログラム/hello.py
では、改めて実行してみます。
$ C:\プロジェクト>pyexe.bat
$ C:\プロジェクト>python C:/プロジェクト/プログラム/hello.py
Hello World.
正しく実行できました。
改行がなんか変な時
複数行にわたってバッチファイルを記述すると、改行が変なところで起きてしまい、うまく実行できないことがあります。
ここでは、Pythonプログラムをコマンドライン引数を変えながら自動実行させる例を挙げます。
以下のような構成でファイルを用意します。
C:\自動実行
|-プログラム
| |-hello.py
|-autoexe.bat
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('message', type=str)
args = parser.parse_args()
print("Hello {}.".format(args.message))
python C:/自動実行/プログラム/hello.py World
python C:/自動実行/プログラム/hello.py Japan
python C:/自動実行/プログラム/hello.py Python
ではautoexe.bat
を実行してみましょう。
C:\自動実行>autoexe.bat
C:\自動実行>python C:/自動実行/プログラム/hello.py World
Hello World.
C:\自動実行>/プログラム/hello.py Japan
指定されたパスが見つかりません。
C:\自動実行>/自動実行/プログラム/hello.py Python
????
autoexe.bat
の一行目はうまく実行できていますが、途中からなにやら挙動がおかしいです。。。
改行が変なことになって、autoexe.bat
のコードがちょこちょこ消えています。
原因
改行コードが【LF】や【CR】になっていることが原因として挙げられます。
UNIX系ではLFが標準になっていますね。
これを【CRLF】に変更する必要があります。
※改行コードの違いは以下を参照
対処法
VSCodeであれば、文字コード同様、ステータスバーからクリックで変更できます。
右下の改行コードの選択(赤丸で囲ってある箇所)のLF
をクリック
これで完了です。
変更されると、ステータスバーに選択した文字コードが表示されると思います。
では、改めて実行してみます。
$ C:\自動実行>autoexe.bat
$ C:\自動実行>python C:/自動実行/プログラム/hello.py World
Hello World.
$ C:\自動実行>python C:/自動実行/プログラム/hello.py Japan
Hello Japan.
$ C:\自動実行>python C:/自動実行/プログラム/hello.py Python
Hello Python.
今度は改行が適切な位置で行われ、うまく実行できました。
所感
面倒なのでフォルダ名などには極力日本語を入れない方がベターかなと思います。
やむを得ず日本語が含まれる場合は、以上の対処法を試してみてください。
バッチファイルからのpython実行は、ディープラーニングの学習等でパラメータを変えながら夜通し実行する際は便利ですね。