目的・動機
pythonでプログラムを書いていて、
ある時間より後だったら何もしない、前だったらその時間まで "待機する"
みたいなプログラムが書きたかった。
ググってみたが意外と情報がなかったため、メモとして投稿。
プログラム
全体を以下に示す。
細かい部分の説明は後述。
モジュールの説明は省略。
from datetime import datetime, timedelta
import sched
import time
def def1(name):
print name
now = datetime.now()
now = datetime(now.year, now.month, now.day, now.hour, now.minute, 0)
comp = datetime(now.year, now.month, now.day, now.hour, 30)
diff = comp - now
if int(diff.days) >= 0:
scheduler = sched.scheduler(time.time, time.sleep)
scheduler.enter(diff.seconds, 1, def1, ("hoge", ))
scheduler.run()
else:
print "do nothing"
プログラム実行例
例1
プログラム実行日時 : 2018/07/29 16:25:00
指定時刻 : 2018/07/29 16:30:00
実行結果 : 16:30:00まで待機して、”hoge” 出力
例2
プログラム実行日時 : 2018/07/29 16:25:00
指定時刻 : 2018/07/29 16:20:00
実行結果 : 何もせずプログラム終了
ある時間と現在の時刻の差分取得
1行目で現在の日時の取得。
変数now
の小数点がそのままだとあとあと処理がやりづらくなるため、2行目で秒を0に変更。
3行目で同日同時間30分の日時情報を取得。
4行目で差分を計算。
now = datetime.now()
now = datetime(now.year, now.month, now.day, now.hour, now.minute, 0)
comp = datetime(now.year, now.month, now.day, now.hour, 30)
diff = comp - now
現在時刻がある時間より前か後かで条件分岐
if
が前だった場合
指定時刻まで待機して関数def1
を実行。待機する時間はdiff.seconds
が指定してくれる。
else
が後だった場合
サンプルプログラムでは特に何も実行しない。
if int(diff.days) >= 0:
scheduler = sched.scheduler(time.time, time.sleep)
scheduler.enter(diff.seconds, 1, def1, ("hoge", ))
scheduler.run()
else:
print "do nothing"
あとがき
他にこんな書き方できるよとか、ここの処理がまずいなどの意見がありましたら、遠慮せず言ってください。