この記事では、Pythonで関数を定期実行させる方法を解説します。
time
モジュールなどを使って定義してもいいですがSchedule
ライブラリを使うと簡単に実装することができます。標準ライブラリではないのでインストールする必要があります。
それでは、使い方を見ていきましょう!
任意の関数を定期実行するにはSchedule
ライブラリを使います。Schedule
は標準ライブラリではないのでpip
でインストールしましょう!
ターミナルやコマンドプロンプト
pip install schedule
インストールしたら次に使い方を見ていきましょう!
Schedule
ライブラリを使うことで何秒ごと、何分ごと、何時間ごとに関数を実行させたり、毎日17時に実行させたり、曜日を指定して実行させたりと色々することができます。
import schedule
import time
# 定期実行する関数
def job():
print('job実行')
# 1秒ごと
schedule.every(1).seconds.do(job)
# 1分ごと
schedule.every(1).minutes.do(job)
# 1時間ごと
schedule.every(1).hour.do(job)
# 1日ごと
schedule.every(1).days.do(job)
# 毎日17:48
schedule.every().day.at('17:48').do(job)
# 1週間ごと
schedule.every(1).weeks.do(job)
# 毎週水曜日
schedule.every().wednesday.do(job)
# 5秒 ~ 10秒ごと(ランダム)
schedule.every(5).to(10).seconds.do(job)
# 無限ループで実行
while True:
schedule.run_pending()
time.sleep(1)
仕組みとしてはschedule.every().***.do()
で実行する関数(ジョブ)を登録してschedule.run_pending()
が呼び出された際に条件を満たしているジョブを実行します。
なので、1秒間隔のジョブが登録されていたとしてもschedule.run_pending()
が3秒間隔で呼び出されていたとしたら3秒間隔でジョブが実行されます。
このコードを実行するとjob実行
がたくさん出力されますが、どこから出力されたか分からないので引数を受け取ってどのジョブが実行されたのかわかりやすくしましょう!
定期実行する関数に引数が定義されている場合はdo()
に引数の値を指定します。その際、キーワードで指定することもできます。
import schedule
import time
# 定期実行する関数
def job(x):
print(f'{x}: job実行')
# 1秒ごと
schedule.every(1).seconds.do(job, 'seconds')
# 1分ごと
schedule.every(1).minutes.do(job, x='minutes')
# 5秒 ~ 10秒ごと(ランダム)
schedule.every(5).to(10).seconds.do(job, '5 to 10 seconds')
# 無限ループで実行
while True:
schedule.run_pending()
time.sleep(1)
実行結果
seconds: job実行
seconds: job実行
seconds: job実行
seconds: job実行
seconds: job実行
5 to 10 seconds: job実行
seconds: job実行
seconds: job実行
seconds: job実行
seconds: job実行
seconds: job実行
5 to 10 seconds: job実行
seconds: job実行
定期実行したい関数にrepeat
デコレータを修飾することでも同じように実装できます。repaet()
には実行させる時間を指定します。
from schedule import every, repeat, run_pending
import time
@repeat(every(3).seconds)
def job():
print('job実行')
while True:
run_pending()
time.sleep(1)
ジョブに引数を渡したり、1つの関数に複数のデコレータを修飾することもできます。
from schedule import every, repeat, run_pending
import time
@repeat(every(1).seconds, '1 seconds')
@repeat(every(3).seconds, '3 seconds')
def job(x):
print(f'{x}: job実行')
while True:
run_pending()
time.sleep(1)
実行結果
1 seconds: job実行
1 seconds: job実行
3 seconds: job実行
1 seconds: job実行
1 seconds: job実行
1 seconds: job実行
3 seconds: job実行
この記事では、Pythonの関数を定期実行させる方法を解説しました。
決まった時間などで実行しなければならない関数がある場合はぜひ使ってみて下さい。
実際に定期実行する場合に自分のPCを使ってやろうとするとその時間帯にPCを付けておく必要がある。なので、PythonAnywhereなどのサーバー上で実行しておくと良い。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ