本記事は、Pythonでタスクスケジュールを制御できるライブラリ「python-crontab」について説明します。
crontabは特定の時刻になった時に特定の処理やスクリプトを実行可能にする機能です。
「python-crontab」は、crontabをPythonで操作することを可能としたライブラリです。
今回は「python-crontab」の活用方法の一つである「Python単独でタスクスケジュールを管理する」方法について説明します。
目次
python-crontabの使い方
「python-crontab」の基本的な使い方について紹介します。
導入方法
導入方法は他のライブラリと同様pipコマンドを実行すればOKです。
インストールはターミナルを開いて以下のコマンドを実行します。
python-crontabライブラリのcrontabジョブ作成の流れ
python-crontabで新規crontabジョブを生成する流れについて説明します。
crontabジョブ生成に必要な処理は以下の3つです。
・新規ジョブを生成する
・ジョブにスケジュールを設定
・ジョブをタブファイルに保存
新規ジョブを生成する
まずはジョブを生成してコマンドを設定します。
ジョブの生成はnew()メソッドを使用します。
コマンドはターミナルのコマンドラインで実行できるコマンドです。
今回は「helloworld.py」というファイルを実行してその結果をテキストファイルに出力します。
◆helloworld.pyの記述内容
コマンド設定の実行例は以下の通りです。
1 2 3 4 5 6 7 | # ライブラリの読み込む from crontab import CronTab # インスタンスの生成 cron = CronTab() # ジョブを生成してコマンドを設定する job = cron.new(command='python ./helloworld.py>./test.txt') |
ジョブにスケジュールを設定
次にジョブにスケジュールを設定します。
設定は生成したjobのメソッドsetall()を使用します。
パラメータの表記方法は基本的にOSの「crontab」と同じで、右から、「分 時 日 月 曜日」の指定となります。
毎日10時にスケジュールを実行する場合の設定例です。
jobには「hour」、「minute」などのメソッドがあり細かく設定できますが、いろいろ覚えるとかえってややこしくなるので、まずは「setall()」の使い方だけ覚えておけば十分だと思います。
ジョブをタブファイルに保存
最後に設定したジョブの内容をファイルに保存します。
保存にはwrite()メソッドを使用します。
ファイル名はなんでも大丈夫です。
ファイルは上書きされるので保存する場合は先にファイルを読み込んでおきましょう。
◆output.tabの出力内容
以上でジョブの作成は完了です。
ジョブを追加する場合は「cron.new()」で再度ジョブ生成してください。
python-crontabライブラリのジョブ監視と実行の流れ
crontabジョブを監視する方法について説明します。
必要な処理は以下の2つです。
・ファイルから全ジョブを読み込む
・スケジュール実行の時間になるまで監視
ファイルから全ジョブを読み込む
※「ジョブ作成の流れ」から実行する場合はこのステップを飛ばしてもOKです。
まずはファイルから全てのジョブを読み込みます。
ファイル名を指定してインスタンスを生成するとファイル内の全ジョブを読み込むことが可能です。
スケジュール実行の時間になるまで監視
ジョブを読み込んだらスケジュールの監視を開始します。
記述は以下の通りです。
1 2 3 | for result in self.cron.run_scheduler(): # スケジュールになるとこの中の処理が実行される print("予定していたスケジュールを実行しました") |
以上で監視状態に入ります。指定した時間になったらコマンドが自動的に実行されます。
python-crontabライブラリを使用するためのクラス
今までの処理を以下のクラスにまとめました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | from crontab import CronTab class CrontabControl: def __init__(self): self.cron = CronTab() self.job = None # ファイルにジョブを書き込むメソッド def write_job(self, command, schedule, file_name): self.job = self.cron.new(command=command) self.job.setall(schedule) self.cron.write(file_name) # ファイル中のジョブを全て読み込むメソッド def read_jobs(self, file_name): self.cron = CronTab(tabfile=file_name) # ジョブを監視するメソッド def monitor_start(self, file): # スケジュールを読み込む self.read_jobs(file) for result in self.cron.run_scheduler(): # スケジュールになるとこの中の処理が実行される print("予定していたスケジュールを実行しました") |
このクラスの使い方
●Jobを生成する
1.インスタンスを生成します。
2.コマンド、スケジュール、ファイル名を指定してwrite_job()メソッドをコールします。
※ファイル名は任意です。スケジュールの記述方法はOSのcrontabと同じです。
●スケジュールを開始する
1.タスクスケジュールを記述したファイルを指定してread_jobs()をコールします。
2.monitor_start()をコールします。
以上で監視状態となり、指定した時刻になるとコマンドが実行されます。
◆実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 | # コマンドを指定 command = 'python3 ./helloworld.py > ./test.txt' # スケジュールを指定 schedule = '0 10 * * *' # ファイルを指定 file = 'output.tab' # インスタンス作成 c = CrontabControl() # ファイルに書き込む c.write_job(command, schedule, file) # タスクスケジュールの監視を開始 c.monitor_start(file) |
以上、python-crontabの使用方法とコードの作成例でした。
「python-crontab」はOSのcrontabの操作も可能なツールなので機会があればそちらの実装方法も紹介したいと思います。
Pythonでスケジュール管理する方法については以下の記事にまとめています。
Pythonでスケジュール管理する方法まとめ