WindowsタスクスケジューラでPCのスリープ解除と同時に仮想環境のPythonスクリプトを自動実行する方法

# はじめに

『Pythonで定期実行したいものがあるんだけど、AWS Lamda登録してスケジューリング実行するっていう方法しかないのかな。。。』が着想でした。

エンジニアといえども今のご時世的に税金でお金がゴリゴリ減る。。。
安く定期実行できる環境作りたいなと思ったときに、Windowsで標準装備されている救世主的ツールがあることを知り、感動して実際に構築してみることにしました。

# 想定読者
本記事では、PCがスリープ状態から自動で復帰し、その直後にAnacondaの仮想環境を立ち上げて指定のPythonスクリプトを自動実行する方法についてまとめています。
単に定期実行するだけであればもっとシンプルな手段もありますが、スリープ復帰と連動して仮想環境込みで完全に自動化したい方には特に役立つ内容です。ぜひ参考にしてみてください。

* Anacondaなどの**仮想環境で開発**している方
* **タスクスケジューラで `.py` や `.bat` を自動実行**したい方
* **スリープ解除後にタスクが実行されない**現象で困っている方

# 環境 / そのほか
構築環境は以下の通りになっています。
詳細に関しては、[PC紹介の記事](https://qiita.com/Necoze/items/f22bae48e6fa0f3f0f9b)を参照していただきたいです！
※仮想環境と実行したいPythonファイルは、事前に作成しておいてください。

| 項目      | 環境                               |
| -----     | --------------------------------- |
| OS        | Windows 11 Pro                    |
| Python    | 3.10(Anaconda環境)                |
| 仮想環境名(任意) | gpu310                            |

# 準備① 実行batの作成
あるファイルを実行したいときに起動するbatを以下に記載します。
「chcp 65001」はUTF-8に変更するための呪文。
「call」の部分で仮想環境を実行する文を記述します。
ほぼ同じ部分にactivate.batっていうのがあると思うので、その一文の後に仮想環境名を記述。
「Python」の部分で実行したいPythonファイルを記述して下さい。
```bat:run_script.bat
@echo off
chcp 65001
call "C:\Users\{User}\anaconda3\Scripts\activate.bat" gpu310
python D:\01.開発\05KK\main.py
```

# 準備② タスクスケジューラの設定
#### ① タスクスケジューラを開いて、タスクの作成を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/e21abf1f-3df6-4414-bc6f-1cad69cb3aee.png)

#### ② 「全般」の設定を以下の表で実施する。
写真の部分を以下の表のように変更。
※記載していない場所は割愛します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/0fd589c2-303f-43e2-9d6c-b4fc71fb8306.png)

| 項目      | 説明                               |
| -----     | --------------------------------- |
| 名前    | タスクの名前                         |
| 説明    | タスクの説明を記載（書かなくてもよい）  |
| タスクの実行時に使うユーザアカウント | SYSTEM    |
| 最上位の特権で実行する | ✅    |
| 構成 | Windows10 |

※ちなみにSYSTEMは「ユーザまたはグループの変更」で、選択するオブジェクト名を入力という枠で
「SYSTEM」と打ち込み、「名前を確認」のボタンを押してOKを押すことで反映できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/b761c5c8-8532-4b82-bb67-4b5c0fc66324.png)

#### ③ 「トリガー」の設定を実施する。
「新規」のボタンを押して、自分が設定したい実行間隔を設定します。
私は、毎週平日に実施したかったので、トリガーの編集の画像のように設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/f44a0c0a-502d-4819-9c44-09ab788391eb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/a7e9cbb1-2da5-404b-93f9-1fa0fe18ab82.png)

#### ④ 「操作」の設定を実施する。
「新規」のボタンを押して、「操作の編集」画面を表示する。
設定は以下の表の例を参照してみてください。(※画像は私の設定した一例です)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/66937ecf-e17d-4022-962b-1401f9a09c0a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/87607b20-5e95-42d5-8dbd-1ca18774b3da.png)

| 項目      | 説明                               |
| -----     | --------------------------------- |
| プログラム/スクリプト    | cmd.exe                         |
| 引数の追加 | /c "{実行するbatの絶対パス}"  |
| 開始 | {batが存在するファイルの絶対パス} |

#### ⑤ 「条件」の設定を実施する。
「電源」の部分の「タスクを実行するためにスリープを解除する」に✅してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/26139ced-c695-41ec-bed3-5de7231fa387.png)

#### ⑥ 「設定」の設定を実施する。
こちらに関しては、初期値から変更しなくてもいいですが、
私は「タスクを要求時に実行する」のみを選択し、あとはフリーにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/c3a9ea7e-fc01-40d5-b0ea-470117937884.png)

ここまで出来たら、「OK」を押します。

# 準備③ 「電源オプション」の設定
検索欄から「電源プランの編集」を選択し、「詳細な電源設定の変更」を選択し、
赤枠のスリープ解除タイマーの許可を「有効」に変更してください。
変更後、適用＆OKで閉じて大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/6f1e8c26-01a8-4292-8bc6-2352a738dcf2.png)

# いざ、実験
実施の仕方はいたって簡単。
設定したスケジュール時間の前にPCをスリープするだけ。私はこれで自動実行できました👍
スリープ後、スケジュール時間になって実行されているか確認してみてください。
※実行中は画面の電源は切れたままだが、主電源はついているっていう状態になります。


# トラブルシューティング（実際に詰まった点）

* 定期実行のはずが1回しか実行されない。⇒ bat内の命令文に`pause` があり動作しなかったので、削除で解決
* `conda activate` が効かなかった ⇒ `call activate.bat` に変更
* 作業ディレクトリが違うとファイルパスでエラー　⇒　絶対パスを指定してあげて解決

# おわりに
AWSなどのサービスで、自動実行を解決しようとしていましたが、意外と調べれば何でもwindowsの機能として、あることがわかりました。
なにより、、、無料で済んでよかった(´・ω・`)
さぁて、、、ぽさけでも買いに行きますか！（節約とは如何に...）

# 参考文献
https://working.tobi-taka.com/auto_sleep_and_auto_wake