Python文件监控应优先使用watchdog库基于操作系统原生事件接口实现,避免轮询;支持on_created、on_deleted等事件,需防抖、过滤临时文件,并注意生产环境的inotify限制与异步处理。

Python文件监控的核心在于实时捕获文件系统事件,而不是轮询比对。主流方案是借助操作系统原生事件接口(如Linux的inotify、Windows的ReadDirectoryChangesW),通过watchdog库封装实现低开销、高响应的变更检测。
用watchdog监听文件变化
watchdog是目前最稳定易用的Python文件监控库,它屏蔽了底层平台差异,提供统一的事件回调机制。安装后只需定义事件处理器并启动观察者即可。
- 安装:
pip install watchdog - 监听单个目录示例:
from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler class MyHandler(FileSystemEventHandler): def on_modified(self, event): if not event.is_directory: print(f"文件被修改:{event.src_path}") def on_created(self, event): if not event.is_directory: print(f"新文件创建:{event.src_path}") observer = Observer() observer.schedule(MyHandler(), path="/path/to/watch", recursive=True) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() - 支持的事件类型包括:
on_created、on_deleted、on_modified、on_moved,覆盖常见操作场景
避免重复触发与事件合并
编辑器保存文件时可能触发多次on_modified(如先写临时文件再重命名),导致逻辑误判。需结合事件类型和路径特征做去重或合并处理。
- 优先响应
on_moved而非on_modified:许多编辑器(VS Code、Sublime)采用“写入临时文件+原子重命名”方式,此时on_moved更可靠 - 添加简单防抖:记录最近1秒内同一路径的事件,只处理最后一次
- 过滤隐藏文件和编辑器临时文件(如
*.swp、.DS_Store、~$*.docx)
轻量替代方案:轮询对比(仅限小规模)
若无法使用watchdog(如容器中无inotify权限),可退化为定期扫描+哈希比对,但仅适用于文件少、变更不频繁的场景。
立即学习“Python免费学习笔记(深入)”;
- 记录每个文件的
os.path.getmtime()和os.path.getsize(),变化即触发检查 - 对关键小文件(如配置JSON)可计算
hashlib.md5(file.read()).hexdigest()确保内容级一致 - 注意性能:每秒轮询会显著增加IO压力,建议间隔≥2秒,且限制监控目录深度和文件数量
生产环境注意事项
实际部署时需考虑稳定性、资源占用和权限问题。
- Linux下确保inotify句柄数足够:
echo 65536 > /proc/sys/fs/inotify/max_user_watches - 避免递归监听过深或过大目录(如
node_modules),可用ignore_patterns过滤 - 子进程或日志写入需异步处理,防止阻塞事件循环
- 监控进程应配合systemd或supervisor管理,支持自动重启










