Python

【Poetry】cronを使って、スクリプトを好きな時間に自動実行。venv環境での対処法

【Poetry】cronを使って、スクリプトを好きな時間に自動実行。Pythonで業務を自動化しよう

Pythonで作業の自動化に励んでいると、

ふと、スクリプトの実行すら、自動化できるのではないか。

そんなことを思っていたときに、いろいろと調べたのですが、

なかなか仮想環境、特にPoetryの自動実行の記事が全然ありませんでした。

ということで、一日がかりで、スクリプト実行に漕ぎ着けることができたので、

Python+Poetry+cronの使い方をご紹介していきます。

環境

Mac 11.4

python 3.9

仮想環境:Poetry

これからPythonで仮想環境を使いたいという方にはPoetryがおすすめです。

よければ、以下の記事も参考にしてください。

スクリプトの作成

実行したフォルダの構成は以下です。

デスクトップのtest_cronフォルダに、3つスクリプトを作成しました。

(poetryのvenvファイルと、lockファイルはpoetryの通常ファイルです。)

Pythonスクリプト

まずはPythonスクリプトを作ります。

test.pyファイルに以下の記述をしました。

print('hello')

shスクリプトの作成

poetryのような、仮想環境venv下のpythonを使う場合、

このままではcronからpythonの実行を指示できません。

なぜなら、venvフォルダのpythonを見つけてくれないからです。

またpoetryコマンドも実行ができません。

そこで、shスクリプトを作成します。

shファイルは、シェルスクリプトに書く記述を実行してくれるスクリプトです。

今回は、cron.shを作成して、以下の記述をしました。

#! /bin/bash 
cd /Users/xxxxxxxxxxxx/Desktop/test_cron/
. .venv/bin/activate
/Users/xxxxxxxxxxxx/.poetry/bin/poetry run python /Users/xxxxxxxxx/Desktop/test_cron/test.py
deactivate

log用スクリプトの作成

最後に、logを書き出すために、cron.logという空のファイルを作成します。

これで、スクリプトの作成は完了です。

shスクリプト作成の注意点

ちなみに僕がてこずった箇所、大きくこの2点はぜひ注意してください。

注意点①:絶対パスで記入する

2行目、cdの後ろにはフォルダの絶対パスを書きいて、

.shのファイルがある場所を指定します。

(パスが分からなければ、ファイルを選んで、

command+option+c でパスのコピーができます。)

Poetryコマンドも絶対パスです。

Poetryのパスがわからなければ、

which poetry

を実行してください。

またpythonスクリプトも同様に、絶対パスで記述します。

cronを使わなければ、

poetry run python test.py

でよかったのですが、

cronを使う場合は、絶対パスでの記述が必要なため以下に変更しています。

/Users/xxxxxxxxxxxx/.poetry/bin/poetry run python /Users/xxxxxxxxx/Desktop/test_cron/test.py

つまり、書いている内容自体は同じものです。

注意点②:ドットを忘れずに書く

3行目の頭に「.」(ドット)をつけるのを忘れないようにしてください。

. .venv/bin/activat

これがないと実行ができません。

cron(クーロン)とは

Macに標準で入っている、プログラミングのスケジュールソフトです。

パソコンが起動さえしていれば、

cronを使って、プログラムの自動実行が可能です。

(ちなみに、Windowsではタスクスケジューラーを)

初めてcronを使う方

cronの設定については、いろいろな記事が見つかると思うので、

簡単に説明をします。

(すでに使っている方は飛ばしてください)

ちなみに、設定方法がわかりやすく動画になっていたので、URLを載せておきます。

まずはセキュリティのアクセス権を許可します。

設定の、セキュリティとプライバシーからフルディスクアクセスを選択。

鍵マークを外してから、

cronを追加するためには、+のボタンを押してください。

cronで検索すると、表示されるので、こちらを選んで、

チェックマークを入れて、最後に鍵を閉じれば完了です。

Vimの編集設定

続いて、cronをvimで編集できるように以下を実行します。

export EDITOR = vim

続いて、パスを通します。

echo $PATH

これで、cronの編集が簡単にできるようになりました。

cronの設定

cronの編集は以下のコマンドを実行します。

crontab -e

続いて、i を押せば、編集が可能になります。

今回は以下のような記述を入力しました。

00 6 * * * /bin/bash /Users/xxxxxxxxxxxx/Desktop/test_cron/cron.sh(ファイル名) >> /Users/xxxxxxxxxxxx/Desktop/xxxxxxx(フォルダ名)/cron.log 2>&1
~
~
~
~
~
~
~
"/tmp/crontab.m6OpOiMI0T" 1L, 135B

時間、日付、曜日は、00 6 * * * の部分を変更することで好きに設定が可能です。

保存は、escボタンを押してから、:wqを入れてエンターです。

詳しいcronの記述は以下を参考にしてください。

[sanko href="https://www.server-memo.net/tips/crontab.html" title="crontabの書き方" site="server-memo.net" target="_blank"]

cron記入時の注意点

ポイントは、時間日付(00 6 * * *)の記述の後ろを、pythonではなく、

/bin/bash としているところです。

これにより、shスクリプトの実行を命令することができます。

今回は、shファイルを、デスクトップのフォルダにいれているので以下のパスを入れています。

shスクリプトのパス:

/bin/bash /Users/xxxxxxxxxxxx/Desktop/test_cron/cron.sh

ログの書き出しファイル:

/Users/xxxxxxxxxxxx/Desktop/test_cron/cron.log 2>&1

これで、shスクリプト経由で、pythonスクリプトを実行することが可能です。

実行結果

実行結果は、

cron.logに記入をされています。

指定した時間以降に、実際にpoetryが実行されているかを確認してください。

logにも以下が記入されていたので、無事に実行がされたようです。

hello

エラーがでていたら

エラーの場合は、このlogにエラーの内容が記載されています。

またshファイルは、

./をつければ、そのまま実行が可能です。

今回の場合は、以下です。

./cron.sh

一度、cronを使わず、shファイル単体で実行ができるかも確認してみてください。

まとめ

今回は、cronを使って、

自動でpoetry下のpythonを実行する方法をご紹介しました。

例えば、Google Analyticsのレポートを毎日手動でスクリプト実行するのではなく、

毎朝自動で、レポートを書き出す、ような使い方が可能です。

ぜひ業務の効率化に役立ててください。

-Python