如何在Python schedule模块中仅在工作日执行任务?
如何在Python schedule模块中仅在工作日执行任务
嘿,我完全懂你现在的困扰——手动重复定义周一到周五的任务真的太繁琐了!其实有几种更优雅的方式来实现仅工作日执行的需求,不用一遍遍复制粘贴代码。下面分享两种实用的方法:
方法一:任务内添加工作日判断(简单快捷)
这种方法的思路是保持原有的每日调度,但在任务执行前先检查当天是否为工作日,非工作日直接跳过执行逻辑。
首先写一个辅助函数判断是否为工作日:
from datetime import datetime def is_workday(): # weekday() 返回0=周一,4=周五,小于5就是工作日 return datetime.today().weekday() < 5
然后修改你的任务函数,添加判断:
def turn_on(): if not is_workday(): return # 非工作日直接返回,不执行后续逻辑 # 这里写你的turn_on实际操作 print("设备已开启") def turn_off(): if not is_workday(): return # 这里写你的turn_off实际操作 print("设备已关闭")
最后只需要定义一次每日调度即可:
import schedule schedule.every().day.at("06:00").do(turn_on) schedule.every().day.at("07:40").do(turn_off) schedule.every().day.at("16:05").do(turn_on) schedule.every().day.at("21:05:00").do(turn_off)
优点:代码改动最小,快速实现需求;缺点:非工作日时任务依然会被调度触发,只是不执行核心逻辑(对大多数场景来说影响不大)。
方法二:批量创建工作日任务(精准调度)
如果你希望任务只在工作日被调度,根本不会在周末触发,可以通过循环批量给周一到周五添加任务,避免重复代码:
import schedule # 定义工作日列表 workdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] # 批量添加任务 for day in workdays: # 获取对应工作日的调度器 daily_schedule = getattr(schedule.every(), day) daily_schedule.at("06:00").do(turn_on) daily_schedule.at("07:40").do(turn_off) daily_schedule.at("16:05").do(turn_on) # 21:05的任务如果也是仅工作日执行,同样可以放进循环 for day in workdays: getattr(schedule.every(), day).at("21:05:00").do(turn_off)
优点:仅在工作日创建调度任务,周末完全不会触发;缺点:代码比方法一多一点,但胜在精准。
额外补充:处理节假日
如果需要排除法定节假日,可以扩展is_workday函数,维护一个节假日日期列表,结合判断:
# 示例节假日列表,格式为YYYY-MM-DD holidays = ["2024-10-01", "2024-10-02"] def is_workday(): today = datetime.today().strftime("%Y-%m-%d") return datetime.today().weekday() < 5 and today not in holidays
这样就能同时排除周末和指定节假日了。
内容的提问来源于stack exchange,提问作者runnerX
相关产品推荐
相关产品推荐

