schedule库适合轻量单机定时备份,核心是注册任务并循环调用run_pending();需手动处理路径、覆盖和异常,推荐shutil.copy2()+os.makedirs()+日志记录;长期运行应换APScheduler或系统级方案。

用 schedule 库写最简定时备份逻辑
不需要上 APScheduler 或系统级 cron,日常单机备份用 schedule 足够轻量。它不带后台服务、不依赖系统调度器,适合脚本式部署。
安装后直接循环检查时间即可:
pip install schedule
核心逻辑是:定义备份函数 → 用 schedule.every().day.at("02:00").do(backup_files) 注册任务 → 在 while True: 中调用 schedule.run_pending()。
注意:schedule 不开新线程,主线程会一直阻塞在 time.sleep(1) 上,所以不能跟其他长期运行逻辑(比如 Flask Web 服务)混在同一进程里跑。
备份函数必须处理路径、覆盖和异常三件事
手动复制文件看似简单,但实际容易出错:源路径不存在、目标目录没创建、同名文件被意外覆盖、中文路径乱码……这些都得显式兜住。
推荐用 shutil.copy2()(保留修改时间/权限)+ os.makedirs(..., exist_ok=True) + 异常捕获:
import shutil
import os
from datetime import datetime
<p>def backup_files():
src = r"C:\data\report.xlsx" # Windows 示例,Linux/macOS 用 /home/user/file.txt
dst<em>dir = r"D:\backup"
timestamp = datetime.now().strftime("%Y%m%d</em>%H%M%S")
dst = os.path.join(dst<em>dir, f"report</em>{timestamp}.xlsx")</p><pre class="brush:python;toolbar:false;">try:
os.makedirs(dst_dir, exist_ok=True)
shutil.copy2(src, dst)
print(f"✅ 备份完成:{dst}")
except FileNotFoundError:
print(f"❌ 源文件不存在:{src}")
except PermissionError:
print(f"❌ 权限不足,无法写入 {dst_dir}")
except Exception as e:
print(f"❌ 备份失败:{e}")
关键点:
-
shutil.copy2()比copy()更稳妥,尤其对需要审计时间戳的场景 - 目标路径用
os.path.join()拼接,避免手动加反斜杠或正斜杠引发跨平台问题 - 不要用
shutil.copytree()直接备份整个目录——它要求目标目录必须不存在,和定时覆盖场景天然冲突
避免 Windows 下脚本后台静默退出的坑
双击运行 .py 文件或通过计划任务启动时,如果备份出错或没输出,你根本看不到报错——窗口一闪就关了。
解决方法只有两个:
- 把脚本改成
.pyw后缀 + 用logging写日志到文件(而不是只靠print) - 或者强制用
pythonw.exe运行,并重定向 stdout/stderr 到日志(例如:pythonw.exe backup.py > backup.log 2>&1)
日志建议至少记录时间、操作、结果状态:
import logging
logging.basicConfig(
filename="backup.log",
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
# 然后把 print(...) 换成 logging.info(...) / logging.error(...)
否则某天发现备份停了三天,却没有任何线索。
真正要长期跑,就得换 APScheduler 或系统级方案
schedule 适合测试和临时任务。一旦要保证「机器重启后自动拉起」「错过执行时间能补跑」「多个任务间精确协调」,它就力不从心了。
这时该切到 APScheduler(Python 原生)或系统级工具:
-
APScheduler:支持内存/SQLAlchemy/MongoDB 作为 job store,能持久化任务状态;用BackgroundScheduler启动后不阻塞主线程 -
Windows Task Scheduler:导出 XML 任务配置可复用,触发条件比 Python 脚本更丰富(如「登录时」「空闲时」) -
systemd timer(Linux):比cron更可靠,支持 OnBootSec、RandomizedDelaySec 等精细控制
别低估调度器本身的可靠性成本——一个没加锁的多实例并发备份,可能把同一份文件复制出十个时间戳相同但内容损坏的副本。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











