pythonスクリプトをWindowsのタスクスケジューラで実行するには、スクリプトを "exe化する"とよい
BLEでSwitchBot温湿度計のデータを取得
pythonの<bluepyライブラリー>を使って、SwitchBot温湿度計のデータを取得、ブログ「山麓カメラ・森の気温」(https://asamanews.hatenablog.com/)で数年前から公開しているが、今回、Windows機でもSwitchBot温湿度計のデータを取得する必要が生じたことから、この time-consuming job は始まった。<bluepyライブラリー>はWindowsでは使えず、最近のLinuxでも<bleakライブラリー>の利用が勧められているため、現有の別のLinux機には、<bleakライブラリー>を利用した温湿度計データ取得スクリプトを既に導入している。このため、Windows機でのSwitchBot温湿度計データ取得も容易だろうと考えたが、Linuxのcronにあたるタスクスケジューラがうんともすんとも言わなかった。
Windowsのタスクスケジューラではpythonスクリプトが正しく動作しない
コマンドラインで正常に温湿度計データを取得でき、標準出力のリダイレクトでファイルにも書き込める(追記できる)ことを確認したのち、このスクリプトをWindows タスクスケジューラで実行させたが、『ファイルに書き込めない』・『タスクスケジューラにエラーは表示されない』という困った状況が出現、解決策が見いだせなかった。あまりにいろいろ対策したので、記憶が定かでなくなった点もあるが、追記モードで書き込めなかったのは確かで、「追記」でなければ時折書き込めたようでもあり、さらに混乱した。ネットでのAIチックな回答(Google検索で先頭に現れるAIを思わせる回答)は、常識的な範囲に留まり、参考にはならなかったが、すべて試してみた。AIチックな回答が自信をもって勧めてきた『バッチファイル化』も試みたが、同じく書き込めなかった。
pythonスクリプト内でのファイルI/Oでもダメ
標準出力(追記)が悪いのかと、pythonスクリプトに下記のファイル書込みコードを追加して試してみたが、これもWindowsタスクスケジューラに登録すると、標準出力同様、書き込めなかった。
with open("d:\python\SwitchBotData\output.txt","a",encoding="utf-8") as f:
print(f"{datetime.datetime.now()},{temp},{humid},{battery}", file=f)解決策はPyInstallerによるexe化だった
いよいよ困って、ネット上のヒューマンの書き込みを精査したところ、「なんでWindowsのタスクスケジューラでPythonスクリプト動かすのってこんなに複雑なんだろう?(簡単なやつができないんだよね:)」とか、「スクリプトは普通に実行するとうまくいくんだけど、スケジュールされたタスクだと失敗するんだよね」とか、いろいろ問題があることが分かった。これらの書込みの中に、バッチファイル化や『exe化』を推奨しているものがあり、exe化とはどんなものだろうと試したところ、Windowsタスクスケジューラで追記モードでの書き込みができるようになった。(pythonスクリプト内でのファイルI/Oで確認)
<PyInstallerにょるexe化>
1. pip install pyinstaller
2. pyinstaller --onefile スクリプト.py → distフォルダ―にexeが生成されるGoogle検索で先頭に現れるAIチックな回答
Linuxならcronで簡単に対応できるが、 Windowsでは大変な回り道をしてしまった。AIチックな回答(Google検索で先頭に現れるAIを思わせる回答)がしゃしゃり出てくるのも問題だが、この " 検索条件によって少しづつ態度を変える" 回答に惑わされないよう、構えておく必要もあるだろう。pythonとWindowsタスクスケジューラの相性不具合は、今回のBLEモジュール特有の問題なのかもしれないが、とにかく注意が必要だ。
