1. 簡単なタスクの設定
では簡単な例から始めましょう。毎日メールをチェックすることをリマインドするコードを作る方法です。
import schedule
import time
def job():
print("リマインダー: メールをチェックしてください!")
# 毎日実行するタスクを設定
schedule.every().day.at("09:00").do(job)
while True:
schedule.run_pending()
time.sleep(1)
この例では、job関数が毎朝9時に呼び出されます。scheduleライブラリは run_pending()を使って1秒ごとにスケジュールされたタスクをチェックします。タスクを実行するには、コードを常に実行状態に保つ必要があります。
ハッカーの注意点
every().hourを使えば毎時間実行できますし、every(2).hoursで2時間ごとにタスクを実行することも可能です。可能性はほぼ無限大。
2. 平日のリマインダー
次に、少し状況を複雑にしましょう。平日だけリマインダーが必要だとします。たとえば、毎平日に同じリマインダーが欲しい場合。
import schedule
import time
def weekday_job():
print("仕事リマインダー: レポートを準備するのを忘れないで!")
schedule.every().monday.at("08:00").do(weekday_job)
schedule.every().tuesday.at("08:00").do(weekday_job)
schedule.every().wednesday.at("08:00").do(weekday_job)
schedule.every().thursday.at("08:00").do(weekday_job)
schedule.every().friday.at("08:00").do(weekday_job)
while True:
schedule.run_pending()
time.sleep(1)
この場合、毎平日朝8時にレポート準備を思い出させるリマインダーが表示されます。このスクリプトは、あなたが忘れてもスケジュールを守ります。
3. 毎週のタスク設定
毎週日曜日にリマインダーが欲しい場合はどうしますか?たとえば、仕事の週が始まる前にコーヒーの在庫を確認したいとします。その方法を見てみましょう:
import schedule
import time
def sunday_job():
print("リマインダー: 来週のためにコーヒーの在庫を確認してください!")
schedule.every().sunday.at("18:00").do(sunday_job)
while True:
schedule.run_pending()
time.sleep(1)
このコードスニペットで、日曜日に少し秩序が加わり、次の週の準備をするよう思い出させてくれます。これで、最も予期せぬ瞬間にコーヒーがなくなることはありません。
4. タスクの変更
スケジュールからタスクを削除
タスクの実行をキャンセルしたい場合は、cancel_job()メソッドを使用できます。たとえば、スケジュールからタスクを削除するには、タスクオブジェクトを取得し、 cancel_job()を呼び出します。
job = schedule.every().day.at("09:00").do(daily_task)
schedule.cancel_job(job) # スケジュールからタスクを削除
タスクの移動
タスクの実行時間を変更するには、スケジュールを再設定します。たとえば、タスクが9:00に予定されていた場合、それを10:00に変更できます。
# 毎日9:00にタスクをスケジュール
job = schedule.every().day.at("09:00").do(my_task)
# タスクを10:00に移動
job.clear() # 現在のタスクスケジュールをクリア
job.at("10:00") # 新しい時間に移動
アクティブなタスクの確認
スケジュールされたタスクがあるかどうか確認するには、schedule.jobsを使用して、すべてのアクティブなタスクのリストを出力します。
# 複数のタスクを追加
schedule.every().day.at("09:00").do(my_task)
schedule.every().monday.at("10:00").do(my_task)
# すべてのアクティブなタスクを見る
for job in schedule.jobs:
print("タスク:", job)
スケジュールからすべてのタスクを削除
スケジュールをクリアしてすべてのタスクを削除するには、clear()メソッドを使用します。
# 複数のタスクを計画
schedule.every().day.at("09:00").do(my_task)
schedule.every().hour.do(my_task)
# スケジュールのクリア
schedule.clear()
タスクを一度だけ実行
特定の時点でタスクを一度だけ実行したい場合があります。そのようなタスクを実行した後、 schedule.cancel_job(job)を使用してキャンセルします。
def one_time_task():
print("タスクが一度実行されました")
return schedule.CancelJob # 実行後にタスクをキャンセル
# タスクを一度だけスケジュール
schedule.every().day.at("09:00").do(one_time_task)
while True:
schedule.run_pending()
time.sleep(1)
5. 実際の使用シナリオ
ではもっと現実的な話をしましょう。このような自動化がプロフェッショナルな環境でどのように使用されるのか。例えば:
- 毎日または毎週データを自動収集。
- 特定の日と時間にレポートを作成して送信。
- サーバーやウェブインターフェースの状態を監視し、エラー通知を送信。
- データベースの定期バックアップを実行。
よくあるミス
タスクスケジュールを設定している間、例えばサーバーとローカルコンピュータが異なるタイムゾーンにある場合など、時間の非同期性に注意してください。また、スクリプトが誤って終了すると、スケジュールされたタスクは実行されません。cron(Unix系システム向け)やWindows Task Schedulerのようなツールを使用して監視を行いましょう。
間違ってtime.sleep(1)をループの最後に置き忘れると、コードがプロセッサを常に消費することになります。スクリプトを正常に動作させ続けることをお忘れなく。
GO TO FULL VERSION