毎回、Pythonのスクリプト実行がめんどくさい!
実行を自動化する方法を教えて!
Pythonで作業の自動化に励んでいると、コードは書けたけど、毎日スクリプトの実行とか、
まじ、めんどさい!
そんなことを思うのは当然の真理ですよね。
ところが・・・! 自動実行についての記事はあるものの、Pythonの仮想環境であるPoetryを使った自動実行の記事が全然見つかりませんでした。
ということで、今回は【Python+Poetry】× cronを使って、スクリプト自動実行の方法をご紹介していきます。
- shスクリプトの作成方法
- cronの使い方
- Vimの編集方法
環境
OS | Mac 10.15.4 |
Python | python 3.9 |
仮想環境 | Poetry |
Homebrew | 8.0.19 Homebrew |
これからPythonで仮想環境を使いたいという方にはPoetryのおすすめ記事も書いていますよ!
よければ、以下の記事も参考にしてください。
【前提】ファイルの構成と、スクリプト
実行していくファイルの構成は以下の通りです。
少しみづらいですが、デスクトップのtest_cronフォルダに、3つスクリプトを作成しました。
- test.py
- cron.sh
- cron.log
(poetryのvenvファイルと、lockファイルはpoetryの通常ファイルですね。)
Pythonスクリプト
まずはPythonスクリプトを作ります。
test.pyファイルに以下の記述をしました。
print('hello')
【悲報】cronでpoetryコマンドが使えない・・・?
後述するcronを使ってスクリプトの自動実行を設定するのですが、ここで注意点です!
poetryをはじめ、仮想環境(venv)下のpythonを使う場合、cronから直接pythonの実行指示をすることができません。
cronを実行しても、venv内のpythonを見つけてくれないのです。
また、残念ながらcronで直接poetryコマンドも実行ができません。
オワタ・・・_| ̄|○
いやいや、諦める必要はありませんので、安心してください★
shスクリプトの作成
そこで、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
※ xxxxxxxxxの部分にはご自身の情報を入れてください。
log用スクリプトの作成
cronを実行した際のlog(ログ)を書き出すために、同じファイルに、cron.logという空のファイルを用意しておきます。
これで、スクリプトの作成は完了です。
shスクリプト作成の注意点
ちなみに僕がてこずった箇所、大きくこの2点はぜひ注意してください。
注意点①:絶対パスで記入する
cron.shスクリプトの2行目:cdの後ろにはフォルダの絶対パスを書いて、.shのファイルがある場所を指定します。
※パスが分からなければ、ファイルを選んで、command+option+c でパスのコピーができます。
Poetryコマンドも絶対パスです。
Poetryのパスがわからなければ以下で確認が可能です。
which poetry
またpythonスクリプトも同様に、絶対パスで記述します。
cronを使わなければ、以下でよかったのですが、
poetry run python test.py #←cronを使わなければこれで良かったが、
cronを使う場合は、絶対パスでの記述が必要なため以下に変更が必要です。(内容自体は同じもの)
/Users/xxxxxxxxxxxx/.poetry/bin/poetry run python /Users/xxxxxxxxx/Desktop/test_cron/test.py
注意点②:ドットを忘れずに書く
3行目の頭に「.」(ドット)をつけるのを忘れないようにしてください。
. .venv/bin/activat
これがないと実行ができないんです。汗
cron(クーロン)はMacの予約ソフト
cron(クローン)とはMacに標準で入っているプログラミングのスケジュールソフトです。
パソコンが起動さえしていれば、cronを使って、プログラムの自動実行が可能です。
(ちなみに、Windowsではタスクスケジューラーを使います!)
おすすめの動画(動画の解説は、Winの方でも、Macの方でもOKです)
cronの設定については、いろいろな記事が見つかると思うので簡単に説明をします。
すでに使っている方は飛ばしてOKです。
ちなみに以下の動画で設定方法が詳しく解説されていますよ!
初めてcronを使う方へ:cronの設定方法
まずはセキュリティのアクセス権を許可します。
設定の、セキュリティとプライバシーからフルディスクアクセスを選択。
鍵マークを外してから、cronを追加するためには、+のボタンを押してください。
cronで検索すると、表示されるので、こちらを選んで、チェックマークを入れて、最後に鍵を閉じれば完了です。
初めてcronを使う方へ:Vimの編集設定
続いて、cronをvimで編集できるように以下を実行します。
export EDITOR = vim
続いて、パスを通します。
echo $PATH
これで、cronの編集が簡単にできるようになりました。
cronの設定
cronの編集は以下のコマンドを実行します。
crontab -e
続いて、キーボードの i を押せば、編集が可能になります。
今回は以下のような記述を入力しました。(毎日朝の6時に自動で実行という内容)
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の記述は以下を参考にしてください。
cron記入時の注意点:bashを選択
ポイントは、時間日付(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のレポートを毎日手動でスクリプト実行するのではなく、毎朝自動で、レポートを書き出すような使い方が可能です。
ぜひ業務の効率化に役立ててください。
僕はこのスクリプト実行に漕ぎ着くまでに一日を要してしまいました!汗
皆さまの血肉になれば幸いです^ ^
コメント