使用Python datetime实现每日22:00定时脚本遇布尔值失效问题
问题根源
你当前的codeRan变量是脚本内的临时变量,每次脚本启动时都会被重新赋值为False——不管之前有没有执行过,只要脚本重启,这个变量就会重置,自然没法实现“每日只执行一次”的效果。
解决方案
下面给两种实用的实现方式:
方法1:用文件记录执行状态(推荐,适合配合系统任务计划)
通过一个本地文件记录上次执行的日期,每次脚本运行时对比当前日期,判断是否已经执行过。就算脚本被多次启动,也能准确控制每日只执行一次。
import datetime today = datetime.date.today() # 用来记录上次执行日期的文件 status_file = "last_run.txt" # 读取上次执行的日期 last_run_date = None try: with open(status_file, "r") as f: last_run_date = datetime.date.fromisoformat(f.read().strip()) except FileNotFoundError: # 文件不存在说明从未执行过 pass time_now = datetime.datetime.now() time_hour = time_now.strftime("%H") time_full = time_now.strftime("%X") time_ampm = time_now.strftime("%p") if time_hour == "22": if last_run_date != today: print(f"{time_hour} That is correct!") # 更新记录的日期 with open(status_file, "w") as f: f.write(today.isoformat()) else: print("Script already ran. Wait 24 hours") else: print(f"Not time yet, it's only {time_full}. The script will run at 22:00{time_ampm}")
你可以把这个脚本加到系统的任务计划里(比如Windows的任务计划程序、Linux的cron),设置为每小时或者每半小时启动一次,到22点时自动执行,且当天只执行一次。
方法2:让脚本持续运行,循环检查时间
如果不想依赖系统任务计划,可以让脚本一直后台运行,循环检查当前时间,用内存变量记录当日是否执行过。注意要加睡眠间隔,避免占用过多CPU资源。
import datetime import time code_ran_today = False today = datetime.date.today() while True: time_now = datetime.datetime.now() time_hour = time_now.strftime("%H") time_full = time_now.strftime("%X") time_ampm = time_now.strftime("%p") # 跨天时重置执行状态 if datetime.date.today() != today: code_ran_today = False today = datetime.date.today() if time_hour == "22" and not code_ran_today: print(f"{time_hour} That is correct!") code_ran_today = True elif time_hour != "22": print(f"Not time yet, it's only {time_full}. The script will run at 22:00{time_ampm}") else: print("Script already ran. Wait 24 hours") # 每分钟检查一次,可根据需求调整间隔 time.sleep(60)
这种方式需要脚本一直运行,若脚本意外崩溃,当天可能不会执行,适合稳定性要求不高的场景。
内容的提问来源于stack exchange,提问作者Spykerwolf
相关产品推荐
相关产品推荐

