You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python每日定时任务调度:跳过指定日期及语法错误修正

嘿,我来帮你解决这个调度任务跳过特定日期的问题!你原来的代码里用了.except()方法,但schedule库本身并没有这个内置方法,这就是语法错误的根源啦。下面给你几种实用的正确实现方式,按需选择:

方法一:在任务函数内部添加日期判断(最直观)

这种方式直接在任务执行前检查当前日期是否属于要跳过的范围,如果是就直接返回,不执行核心任务逻辑。

import schedule
import time
from datetime import datetime

def job():
    # 先把当前日期转换成你定义的编号:0=周日,6=周五,7=周六
    def get_custom_weekday():
        iso_day = datetime.now().isoweekday()  # Python标准:1=周一,7=周日
        if iso_day == 7:
            return 0  # 周日对应你的编号0
        elif iso_day == 6:
            return 7  # 周六对应你的编号7
        elif iso_day == 5:
            return 6  # 周五对应你的编号6
        else:
            return iso_day  # 周一到周四保持1-4的编号
    
    current_custom_day = get_custom_weekday()
    # 检查是否是需要跳过的日期
    if current_custom_day in {0, 6, 7}:
        print(f"今日自定义星期编号为{current_custom_day},跳过任务执行")
        return
    
    # 这里是你的核心任务逻辑
    print("开始执行每日调度任务!")

def cron_job():
    # 每天00:00触发任务
    schedule.every().day.at("00:00").do(job)
    while True:
        schedule.run_pending()
        time.sleep(1)

if __name__ == "__main__":
    cron_job()
方法二:返回schedule.CancelJob终止当日任务

这种方式通过返回schedule.CancelJob对象,让调度器直接取消当天的任务触发,逻辑更贴合调度库的设计。

import schedule
import time
from datetime import datetime

def should_run_task():
    # 同样的日期编号转换逻辑
    iso_day = datetime.now().isoweekday()
    if iso_day == 7:
        return False  # 周日(你的0)不执行
    elif iso_day == 6:
        return False  # 周六(你的7)不执行
    elif iso_day == 5:
        return False  # 周五(你的6)不执行
    return True

def job():
    if not should_run_task():
        # 返回CancelJob,调度器会取消本次任务
        return schedule.CancelJob
    # 核心任务逻辑
    print("开始执行每日调度任务!")

def cron_job():
    schedule.every().day.at("00:00").do(job)
    while True:
        schedule.run_pending()
        time.sleep(1)

if __name__ == "__main__":
    cron_job()
补充说明
  • 你提到的日期编号(0=周日、6=周五、7=周六)和Python标准库datetime的默认编号规则不同,所以代码里专门做了映射转换,你可以根据实际的日期对应需求调整这个映射逻辑。
  • 原代码的语法错误是因为schedule库的调度对象并没有内置的.except()方法,所以需要通过自定义判断来实现跳过特定日期的功能。

内容的提问来源于stack exchange,提问作者Dhiman Ghosh

火山引擎 最新活动