🏩

WSL+VenvでPythonコードをWindows側から自動実行するメモ

2023/06/20に公開

はじめに

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