watchdog是监控目录变化最可靠的Python方案,它封装inotify/FSEvents/ReadDirectoryChangesW实现跨平台事件驱动,避免轮询;需用绝对路径、启用recursive=True、合理处理事件去重与上传隔离。

用 watchdog 监控目录变化最可靠
Python 标准库没有开箱即用的跨平台文件系统事件监听能力,watchdog 是目前最稳定的选择——它底层封装了 inotify(Linux)、FSEvents(macOS)、ReadDirectoryChangesW(Windows),避免手动轮询带来的延迟和 CPU 消耗。
安装只需:
pip install watchdog注意不要装错成同名但已废弃的
Watchdog(首字母大写)包。
常见踩坑点:
-
Observer启动后必须调用join()或保持主线程存活,否则程序立即退出,监听失效 - 路径传入
observer.schedule()时,务必用绝对路径,相对路径在守护进程或不同工作目录下容易静默失败 - 子目录默认不递归监听,需显式传参
recursive=True
同步逻辑要区分事件类型,不能一概而论
文件系统事件有 CreatedEvent、ModifiedEvent、MovedEvent、DeletedEvent 四类,直接对每个 ModifiedEvent 都触发上传会导致大量重复请求(比如编辑器保存时先清空再写入,会触发两次 ModifiedEvent)。
立即学习“Python免费学习笔记(深入)”;
实操建议:
- 对
CreatedEvent和MovedEvent(含重命名)立即同步,它们代表“新内容就位” - 对
ModifiedEvent加 1–2 秒去抖(debounce),用threading.Timer延迟执行,避免高频编辑干扰 -
DeletedEvent需谨慎:本地删了不等于云端也要删,建议配置开关控制是否反向同步删除操作
上传到云端优先选 boto3(S3)或 google-api-python-client(Google Drive)
不要自己拼 HTTP 请求上传文件。S3 和 Google Drive 都提供成熟 SDK,内置分块上传、断点续传、凭证自动刷新等关键能力。
关键差异点:
-
boto3上传大文件推荐用upload_file()(自动分块),别用put_object()(内存加载整个文件) - Google Drive 的
files.create()接口要求先生成media_body,且单次上传上限 5MB;超限必须走resumable流式上传 - 所有上传操作必须包装异常处理:
ClientError(S3)、HttpError(Drive),网络中断或配额超限不能让监听器崩溃
避免监听器卡死:必须做阻塞隔离和错误隔离
上传是 I/O 密集型操作,如果在事件回调里直接同步上传,一旦网络卡住或云端响应慢,后续所有文件变更都会积压,最终丢失事件(watchdog 内部队列有长度限制)。
正确做法是把上传任务丢进线程池或队列:
- 用
concurrent.futures.ThreadPoolExecutor提交上传任务,设置max_workers=3防止并发过多打爆内存 - 上传失败的任务应记录日志并加入重试队列(如用
queue.Queue+ 单独消费者线程),而不是直接丢弃 - 监听器主循环(
observer.start())和上传逻辑完全解耦,哪怕上传模块崩溃,目录监听仍持续运行
真正难的不是监听,而是怎么让“监控 → 判定 → 上传 → 重试 → 状态反馈”这一整条链路在后台稳住,尤其当用户一边改文档一边移动文件夹时,事件顺序和竞态条件比想象中复杂得多。


















