
大家好,欢迎来到 Crossin 的编程教室。
在开发自动化脚本时,我们常遇到这种痛点:每当新数据文件存入文件夹,或者修改了配置文件,都必须手动重新运行脚本才能生效。
这种“手动触发”不仅低效,且极易遗漏。虽然可以用 while True 循环去轮询文件时间戳,但写起来麻烦,运行间隔短了浪费 CPU 资源,长了又响应不及时。
为了优雅地解决这个问题,watchdog 库应运而生。它就像一个时刻站岗的哨兵,一旦文件夹内发生任何风吹草动,都能立刻触发预设的动作。
核心功能
watchdog 的高性能源于它直接调用了操作系统的内核接口(如 Linux 的 inotify、Windows 的 ReadDirectoryChangesW)。在实际代码中,主要由两个组件协同工作:
1. 事件处理器 (Event Handler)
负责定义“做什么”。通过继承 FileSystemEventHandler,你可以重写特定的方法:
on_modified():文件内容或元数据被修改时触发。
on_created():新文件或目录诞生时触发。
on_deleted():文件被删除时触发。
2. 观察者 (Observer)
负责定义“盯着谁”。它在一个独立的线程中运行,负责监听系统信号并将其派发给处理器。
示例演示
为了更直接地展示 watchdog 的功能,我们将创建一个“自动化监控器”,实时追踪目录下文件的创建与修改情况。
1. 环境准备
pip install watchdog2. 完整代码
你可以将以下内容保存为 monitor.py 并运行:
import time
import sys
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
# 1. 定义事件处理器
class MyHandler(FileSystemEventHandler):
def on_modified(self, event):
if not event.is_directory:
print(f"【修改】文件:{event.src_path}")
def on_created(self, event):
tag = "文件夹" if event.is_directory else "文件"
print(f"【新建】{tag}:{event.src_path}")
# 2. 核心控制逻辑
if __name__ == "__main__":
path = "." # 监控当前目录
event_handler = MyHandler()
observer = Observer()
# recursive=True 表示递归监控子目录
observer.schedule(event_handler, path, recursive=True)
print(f"哨兵已就位,正在监控: {path}")
observer.start()
try:
while True:
time.sleep(1) # 保持主线程存活
except KeyboardInterrupt:
observer.stop()
observer.join()代码说明:
注意事项
在进阶使用 watchdog 时,有一些细节和优化建议能帮你少走弯路:
常用场景
watchdog 主要用于各种可自动触发操作的场景,比如:
掌握了 watchdog,你就等于拥有了一套通用的“文件触发工作流”。你可以将这个模块化思路应用到任何需要实时响应的项目中,让你的 Python 脚本“动”起来。
最后留个思考题:如果想在监控到 .log 文件产生时自动把它备份到一个叫做 logs_backup 的目录里,要怎么做?来动手试试看吧。
如果本文对你有帮助,欢迎点赞、评论、转发。你们的支持是我更新的动力~
本文分享自 Crossin的编程教室 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!