Python文件监控应使用watchdog库而非轮询,因其基于系统原生事件、跨平台且高效;核心事件包括on_created、on_deleted、on_modified、on_moved,生产环境需注意异常隔离、路径安全与资源释放。

Python文件监控的核心是实时捕获文件系统的变化,比如新建、修改、删除、重命名等事件。不依赖轮询(避免资源浪费),推荐使用操作系统原生事件接口——watchdog库是最成熟、跨平台(Windows/macOS/Linux)、轻量且稳定的方案。
为什么不用os.listdir()或time.time()轮询?
轮询看似简单,但存在明显缺陷:
- 无法及时响应:间隔1秒轮询,变化可能延迟近1秒才被发现
- CPU空转:即使无变化,也在持续调用系统调用
- 漏事件风险:两个变化发生在同一轮询周期内,可能只捕获后一个
- 无法区分“内容改”和“属性改”(如仅改了权限或访问时间)
watchdog快速上手:监听指定目录
安装后,三步即可运行一个基础监控器:
pip install watchdog示例代码(监听当前目录下所有.py文件的修改):
立即学习“Python免费学习笔记(深入)”;
from watchdog.observers import Observer from watchdog.events import FileSystemEventHandlerclass PyChangeHandler(FileSystemEventHandler): def on_modified(self, event): if event.is_directory: return if event.src_path.endswith('.py'): print(f"检测到Python文件变更:{event.src_path}")
observer = Observer() observer.schedule(PyChangeHandler(), path='.', recursive=True) observer.start()
try: while True: pass # 运行中... except KeyboardInterrupt: observer.stop() observer.join()
关键事件类型与实际判断技巧
watchdog将变化分为四类基础事件,但真实场景需组合判断:
- on_created:新文件/目录生成(含复制、粘贴、新建)
- on_deleted:文件/目录被删除(含回收站操作)
- on_modified:文件内容或元数据变更(注意:Linux下保存文本常触发两次:先truncate再write)
-
on_moved:重命名或移动(
event.src_path → event.dest_path)
实用建议:
- 监控配置文件时,优先响应
on_modified,但加0.1秒延时去重(防编辑器多阶段写入) - 识别“完整保存动作”,可监听
on_modified+ 检查文件大小是否稳定(连续两次变化间隔>100ms再处理) - 避免重复处理:对同一文件路径做简单时间戳缓存(例如1秒内不再响应第二次修改)
生产环境注意事项
直接跑在脚本里适合调试,上线需考虑健壮性:
- 异常隔离:把文件处理逻辑包进
try...except,防止单个错误中断整个监听 - 路径安全:用
os.path.abspath()标准化监听路径,避免软链接或相对路径歧义 - 资源释放:务必调用
observer.stop()和observer.join(),尤其在信号退出(SIGINT/SIGTERM)时 - 大目录慎用recursive=True:某些文件系统(如NTFS大量小文件)可能导致初始化卡顿,可按需分层监听










