python - 如何安排一个函数在每月最后一天运行?
我想用Python的sched模块安排一个函数在每个月的最后一天运行。
有没有人能帮我实现这个?
2 个回答
1
每个月的最后一天有一个特点,那就是下一个日期的日期值总是比当前的日期值小。
现在,找出从今天到月底还有多少天。可以利用上面提到的这个特点来帮助你。使用 datetime
模块来获取相关信息。
写一个函数
def mydaycount():
,这个函数从0开始,表示今天,然后每过一天就返回一个更大的值。这有点像你调用的时间函数time.time()
,不过这里是针对每一天的。再写一个函数
def mydaydelay(num):
,这个函数会让程序暂停一天。
这里面最重要的部分是
class sched.scheduler(timefunc, delayfunc)
timefunc 可以是任何一个函数,当你调用它时会返回一个值。在你的例子中,它就是 mydaycount
,而 delayfunc 则是 mydaydelay
。
然后你可以用天数(到月底的天数)来调用这个调度对象,并把你的函数作为动作。
scheduler.enterabs(time, priority, action, argument)
你程序的大致框架可以是这样的。
import sched
import datetime
def mydaycount():
yield int_days
def mydaydelay(n):
sleep_for_days(n)
scheduler = sched.scheduler(mydaycount, mydaydelay)
def print_event(name):
print 'EVENT:', name
n_days_to_last_day = 3 # This should be your calculate value
scheduler.entertabs(n_days_to_last_day, 1, print_event, ('last day',))
scheduler.run()
2
每天用 crontab 运行,并检查今天是否是这个月的最后一天,可以使用 calendar.monthrange 来实现:
import datetime, calendar
today = datetime.date.today()
if calendar.monthrange(today.year, today.month)[1] != today.day:
exit()
Python 的 sched 和 crontab 不是同一类东西,除非你说的是另一个 Python 的调度器。Windows 也有类似的调度工具,或者你可以安装 cygwin 的 crontab。
如果你在一个没有系统级任务调度器的奇怪平台上,你可以让一个无限循环一直运行上面的测试,然后用 time.sleep(24*60*60) 来暂停,或者类似的做法。