こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
- Pythonスクリプトを一度きりではなく、定期的に実行できるようにしたい
- Pythonのスケジューラ機能を活用して決まった時刻に定期実行する仕組み構築手順が知りたい
【Python】Scheduleモジュールとは
scheduleとは一定の間隔(数分・数時間・数日おき)で同じ作業を実行できるようにする便利なモジュールです。例えば下記のような用途で利用されます。
- 1日3回データを自動集計する
- 1週間おきにレポートを更新する
- 1ヶ月おきに通知メールを送信する
Pythonでのイベント処理・定期実行関数の組み立て手順
Pythonを用いて定期実行処理を実現するために、「作業内容を記述した実行関数」と「定期実行(スケジュール)の条件を記載したイベント関数」の2つを準備します。
本記事では下記の手順に沿ってこれら2つの関数を準備することとします。
- 定期実行する実行関数を準備
- スケジュールを登録
- スケジュール処理(イベント)実行
定期実行環境の構築には、事前にscheduleモジュールのインストールが必要です。下記をコマンドラインに入力し、インストールを済ませておきましょう。
pip install schedule
定期実行する実行関数を準備
定期的な処理を実行する関数を準備します。今回はテスト用として下記の関数を定期実行してみます。既にお手元にpythonスクリプトがあればそちらを用いられても問題なしです。
#01 定期実行する関数を準備
def task():
print("タスク実行中")
スケジュールを登録
作業を実行するための定期(イベント)条件はschedule.every()メソッド、実行する関数はdo()メソッドを用いて登録します。以下記載例を示します。
定期的な実行条件を設定
2秒毎にtask()関数を実行 | schedule.every(2).seconds.do(task) |
---|---|
2分毎にtask()関数を実行 | schedule.every(2).minutes.do(task) |
2時間毎にtask()関数を実行 | schedule.every(2).hours.do(task) |
2日毎にtask()関数を実行 | schedule.every(2).days.do(task) |
2週間毎にtask()関数を実行 | schedule.every(2).weeks.do(task) |
40秒時点で毎分タスク関数を実行 | schedule.every().minute.at(“:40”).do(task) |
35分時点で毎時間タスク関数を実行 | schedule.every().hour.at(“:35”).do(task) |
12時20分時点で毎日タスク関数を実行 | schedule.every().day.at(“12:20”).do(task) |
毎週月曜日の15:40にタスク関数を実行 | schedule.every().monday.at(“15:40”).do(task) |
スケジュール処理を定期実行
上記で登録した定期条件および実行関数は、schedule.run_pending()メソッドによって起動できます。ここで、schedule.run_pending()を呼び出すのみだと、一度関数を実行して処理が終了してしまいます。そのため、下記のようにwhile文で無限ループするよう指定するのが一般的です。無限ループを指定することで同じ関数(処理)を一定の間隔で繰り返すことができるようになります。
while True:
schedule.run_pending()
sleep(1)
定期実行処理のプログラム組み立て事例
最後に上記手順を総括して作成した定期実行処理のスクリプト例をご紹介します。
10秒おきに関数を定期実行する場合
#00 ライブラリをインポート
import schedule
from time import sleep
#01 定期実行する関数を準備
def task():
print("タスク実行中")
#02 スケジュール登録
schedule.every(10).seconds.do(task)
#03 イベント実行
while True:
schedule.run_pending()
sleep(1)
10秒おきに引数を有する関数を定期実行する場合
#00 ライブラリをインポート
import schedule
from time import sleep
#01 定期実行する関数を準備
def task(work):
print(work+"タスク実行中")
#02 スケジュール登録(01実行関数の引数はdoメソッドの第二引数として指定)
schedule.every(10).seconds.do(task,work="プログラム")
#03 イベント実行
while True:
schedule.run_pending()
sleep(1)
毎日7:00に関数を定期実行する場合
#00 ライブラリをインポート
import schedule
from time import sleep
#01 定期実行する関数を準備
def task():
print("タスク実行中")
#02 スケジュール登録
schedule.every().days.at("7:00").do(task)
#03 イベント実行
while True:
schedule.run_pending()
sleep(1)
22:00まで関数を30秒おきに定期実行する場合
#00 ライブラリをインポート
import schedule
from time import sleep
from datetime import datetime,date
#01 定期実行する関数を準備
def task():
print("タスク実行中")
#02 スケジュール登録
schedule.every(30).seconds.do(task)
#02 何時まで実行するか定義
year = date.today().year
month = date.today().month
hour = 22
minute = 0
second = 0
set_until_time = datetime(year,month,date.today().day,hour,minute,second)
#03 イベント実行 (特定の時間が来るまで定期実行)
while datetime.now() < set_until_time:
schedule.run_pending()
sleep(1)
【参考】Pythonの自作関数をクラウドで定期実行する方法
本記事ではクラウド上でPython関数を定期実行する方法も解説しています。
【AWS】スケジュール関数を作成・定期実行する方法|AWS LambdaとAmazon EventBridgeにて実現
AWSのサービスを用いて自作関数を定期実行する方法を解説します。AWSのサービスとしてLambdaとEventBridgeを用いて実現する方法です。
【参考】Pythonを活用した様々なお役立ち情報
当サイトではPythonを活用した様々なお役立ち情報を配信しています。
Pythonでできること・仕事に応用
「Pythonで実現できることを知りたい」「Pythonスキルを仕事で活かしたい」方はこちら!
Python✖️AI・機械学習
Python活用の最大メリットの1つであるAI・機械学習について詳しく知りたい方はこちら!
Python✖️投資自動化(仮想通貨)
Pythonはフィンテックとの相性が良く、その中でも仮想通貨自動売買タスクは近年注目度の高い領域です。フィンテック・投資に興味がある方はこちら!
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら