Python文件监控应优先使用watchdog库基于操作系统原生事件接口实现,避免轮询;支持on_created、on_deleted等事件,需防抖、过滤临时文件,并注意生产环境的inotify限制与异步处理。
Python文件监控的核心在于实时捕获文件系统事件,而不是轮询比对。主流方案是借助操作系统原生事件接口(如Linux的inotify、Windows的ReadDirectoryChangesW),通过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更可靠*.swp、.DS_Store、~$*.docx)若无法使用watchdog(如容器中无inotify权限),可退化为定期扫描+哈希比对,但仅适用于文件少、变更不频繁的场景。
os.path.getmtime()和os.path.getsize(),变化即触发检查hashlib.md5(file.read()).hexdigest()确保内容级一致实际部署时需考虑稳定性、资源占用和权限问题。
echo 65536 > /proc/sys/fs/inotify/max_user_watches
node_modules),可用ignore_patterns过滤