windowsでpythonのプログラムを簡単に動かすバッチファイルまとめ

#はじめに
pythonのプログラムをコマンドプロンプトやアナコンダプロンプトから実行するのは面倒くさいですよね。
まずスクリプトのあるディレクトリまで移動しなければいけないですし、コマンドラインでの因数が必要になってくるとそれを入力するのはとても大変だと思います。
そこでwindowsのバッチファイルを使用して簡単に実行できるようにする方法を書きます。

#忙しい人向け
![2021-03-20 18-50-19.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/0108bb49-9d7c-4351-45b7-185cca2e564b.gif)


```.bat
call C:\Users\ユーザー\Anaconda3\Scripts\activate.bat
call activate base
for %%i in (%*) do (
python %%i
)
```

これをメモ帳にコピペして適当な名前.batで保存。
実行したいプログラムをこのバッチファイル上にドラッグアンドドロップする（複数可）
そうするとドラッグアンドドロップされたファイルが順番に実行されていく。





#できるようになること
・ドラックアンドドロップで複数のスクリプトの実行
・ドラックアンドドロップであるアナコンダ環境でのスクリプトの実行
・ダブルクリックで指定の複数プログラムの連続実行
・複数プログラムの同時実行

などです。


#前提1.どのディレクトリでプログラムを実行するか

プログラムの中身を相対パスで書いている場合（多くはそうだとは思いますが）、プログラムを実行するディレクトリが大切になってきます。

ここでは、
1バッチファイルのあるディレクトリで実行
2動かすプログラムがあるディレクトリで実行
3それ以外の特定のディレクトリで実行
の三つに分かれると思います。

##1バッチファイルのあるディレクトリで実行

```.bat
cd /d %~dp0
```
これを最初につけます

詳しくはこちら

https://a-zs.net/inuwaka-batch-01/

##2動かすプログラムがあるディレクトリで実行
最初には何も書きません。

##3それ以外の特定のディレクトリで実行
最初に

```.bat
cd ディレクトリのパス
```


を書く



#前提2.anacondaで実行するか
pythonをanacondaで入れている人は多いと思います。
しかし
1anaconda以外でpythonを入れており、パスが通っていない
2anaconda以外でpythonを入れており、パスが通っている
3anacondaで実行する
に大きく分かれます。


##1anaconda以外でpythonを入れており、パスが通っていない
これから記事で紹介するときの

```.bat
python 実行するプログラム.py
```

の部分を

```.bat
ディレクトリのパス\python.exe 実行するプログラム.py
```
にしてください。

参考

https://karupoimou.hatenablog.com/entry/2019/06/03/165414


##2anaconda以外でpythonを入れており、パスが通っている
何もする必要はありません。



##3anacondaで実行する

```.bat
call C:\Users\ユーザー\Anaconda3\Scripts\activate.bat
call activate 仮想環境名
```

これを最初につけてください。
ここで、アナコンダを入れてから環境を作っていない人や、仮想環境？なにそれおいしいの？という人は、仮想環境名はbaseです。

参考

https://kiseno-log.com/2020/04/15/bat%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E4%BB%BB%E6%84%8F%E3%81%AEanaconda%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%81%A7-py%E3%82%92%E8%B5%B7%E5%8B%95/



#前提3.実行したいファイルはどこにあるか

ドラッグアンドドロップの時は考えなくてもいいのですが、
ダブルクリックで実行するときに問題になってきます。
バッチファイルと同じディレクトリ内に実行ファイルがあるときはファイル名はそのままで
`python filename.py`でいいのですが、
そこにないときは、
`python C:\user\username\path\filename.py`
というように絶対パスか相対パスを書いてください。




#実際のバッチファイル
バッチファイルの中身を書いていきたいと思います。
なお、今回は
1.Anaconda環境の初期のbaseで実行し、pathを通していない
2.バッチファイルがあるディレクトリで実行する

という条件で書いていきたいと思います。
上に書いてある前提の内容を参考にして自分に合ったスクリプトにしてください。





##1.ダブルクリックであるプログラムの実行
```.bat
cd /d %~dp0
call C:\Users\ユーザー\Anaconda3\Scripts\activate.bat
call activate base
python test.py
```

`call`はほかのバッチファイルを実行するときに使用します。
今回はanacondaの環境にするために二つのバッチファイルを実行します。
そのほかは普段コマンドプロンプトに書いている内容と同じだと思います。


##2.ドラックアンドドロップでスクリプトの実行

```.bat
cd /d %~dp0
call C:\Users\ユーザー\Anaconda3\Scripts\activate.bat
call activate base
python %1
```

との変更点は`test.py`という具体的な名前が`%1`に変わった点です。
この`%1`というのはドラッグアンドドロップされたファイルのうち最初のファイル名になります。
参考

https://qiita.com/bokkuri_orz/items/9c9c93fae56cc8653988


##3.ダブルクリックで指定の複数プログラムの連続実行

```.bat
cd /d %~dp0
call C:\Users\ユーザー\Anaconda3\Scripts\activate.bat
call activate base
python test.py
python test2.py
python test3.py
```

バッチファイルは上から一行ずつ実行しているだけなので、
プログラムの実行を追加していくだけです。
同時ではなく、連続実行です。
そのため上のプログラムが終了しないと次のプログラムは実行されません。

##3.ドラックアンドドロップで複数のスクリプトの実行



```.bat
cd /d %~dp0
call C:\Users\ユーザー\Anaconda3\Scripts\activate.bat
call activate base
for %%i in (%*) do (
python %%i
)
```

こちらを参考にしました

https://karupoimou.hatenablog.com/entry/2019/06/03/165414

どうやら`%*`がドラッグアンドドロップされたすべてのファイルをさし、
それをforを使用して順番に実行しているだけみたいです。


##4.複数ファイルを同時に実行

```.bat
cd /d %~dp0
call C:\Users\ユーザー\Anaconda3\Scripts\activate.bat
call activate base
start python test.py
start python test2.py
start python test3.py

```

`start`というものを最初につけると、新しくウィンドウを開いて実行されます。
ウィンドウを開いた時点で次の行が実行されるのでほぼ同時に複数実行することができます。
パソコンのメモリやCPUの性能が悪いとパソコンの動作が遅くなり、最悪の場合フリーズする場合があるので注意してください。



##5.複数ファイルを特定間隔で実行開始

```.bat
cd /d %~dp0
call C:\Users\ユーザー\Anaconda3\Scripts\activate.bat
call activate base
start python test.py
ping 127.0.0.1 -n 5 > nul
start python test2.py
ping 127.0.0.1 -n 10 > nul
start python test3.py

```
`ping 127.0.0.1 -n 5 > nul`を挟むことで5秒の待機をしています。
上のコードは、
1. `test.py`を実行
2.  5秒待機
3. `test2.py`を実行
4. 10秒待機
5. `test3.py`を実行
となっています。



#その他


・`rem`と書くと、その行が無視されるので、コメントを書きたいときに使います。
・最後に`pause`を追加するとバッチファイルが終了後もウィンドウが消えない
・`@echo off`を最初につけるとバッチファイルに書いている内容が表示されないようになる。
・sleepを挟みたいときは`ping 127.0.0.1 -n 時間（s） > nul`を書く

参考

https://qiita.com/Targityen/items/8d9fcae5a86dbc713517

その他バッチファイルについては自分で調べるか

https://ykr414.com/dos/dos05.html#01


こちらが詳しいです。


#まとめ
pythonを学んでいる中で、コマンドラインでのディレクトリ移動や入力でいつも時間をとっていました。
バッチファイルを作りたかったのですが、なかなかすぐ動くスクリプトを載せているサイトがなく、分かりにくかったのでまとめがてら作りました。
ここに書いてあるのは最低限なので、自分なりにアレンジしていってください。