python - 如何安排一个函数在每月最后一天运行?

1 投票
2 回答
6329 浏览
提问于 2025-04-16 09:07

我想用Python的sched模块安排一个函数在每个月的最后一天运行。

有没有人能帮我实现这个?

2 个回答

1

每个月的最后一天有一个特点,那就是下一个日期的日期值总是比当前的日期值小。

现在,找出从今天到月底还有多少天。可以利用上面提到的这个特点来帮助你。使用 datetime 模块来获取相关信息。

  1. 写一个函数 def mydaycount():,这个函数从0开始,表示今天,然后每过一天就返回一个更大的值。这有点像你调用的时间函数 time.time(),不过这里是针对每一天的。

  2. 再写一个函数 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) 来暂停,或者类似的做法。

撰写回答