🏩
WSL+VenvでPythonコードをWindows側から自動実行するメモ
はじめに
WSL状ので作ったPythonコードをVenvを使ってWindows上で定期的に実行するためのメモを書いたのでおいておきます
今回は例としてipynbでやる(.pyでやる場合もほぼ同じ)
環境
必要か分からんが一応記載
- Windows10
- WSL2 (Ubuntu 20.04 LTS)
- Python3.10.11(venv)
1. 動かしたいコードを作る
# /home/username/my_script.ipynb
print("Hello, World!")
2. Cronジョブの設定(WSL側)
地味に自分はここでハマった
- Terminalでcrontab -e
- 適当に開いたエディタで下記の行を追加
34 12 * * * .venv/bin/jupyter nbconvert
--execute --to notebook /hoge/hello.ipynb > hoge/my_script_output.txt
- 数字~* * * :時間や週などの頻度を示す。上記は毎日12時34分に実行する場合
- 第一引数:実行したいカーネルを選択する
jupyter notebookの場合.venv/bin/pythonではなく、.venv/bin/jupyterを指定しないと動かない - 第二引数:動かしたいコードの絶対パス
- 第三引数:結果を出力したい場合の出力先(オプション)
- nbconbert : ipynbコードを実行するためにpythonからコンバートするのに使うらしい
従って.pyファイルで行う場合ここは不要 - --execute --to notebook : 出力なくても to notebook指定しないとipynbが動かない
Tips:
「コレ時間なったら本当に動くん??」
っていうのが心配なら、terminal上で下記部分を実行すれば動作してるか確認ができる
.venv/bin/jupyter nbconvert
--execute --to notebook /hoge/hello.ipynb > hoge/my_script_output.txt
ここで動いてればほぼ終わったようなもの
↓動いたらこんな感じのログが出てくる
[NbConvertApp] Converting notebook /hoge/VSCode/hello.ipynb to notebook
3. タスクスケジューラに登録(Windows側)
Windows側はあくまでLinux側(WSL)のcron serviceを動かすための機能なので時間は割といつでもOK(例としてPCつけたらずっと動作とかで良い)
- Windows側のスタートボタン ->タスクスケジューラ起動
- 操作 -> 基本タスクの作成
- 名前と説明を適当に入れる
- 頻度を入力
- 開始時間を入力 ->次
- プログラムの開始にチェック
- プログラム/スクリプト :wsl
- 引数の追加 -u username --exec /usr/sbin/cron -f (usernameは自分の)
・・・この設定ホントにあってる?って心配になったら上記コマンドをPowerShellなりで打ってみればOK - 完了
おわり
これでPCとWSLがついていれば定期的にWSL上のpythonコードをVenvで実行してくれるようになった
Discussion