如何用watchdog监控指定AVI文件并运行对应Python脚本
多目录特定AVI文件监控与脚本触发实现
针对你的需求,我们可以通过扩展原有代码,实现多目录、多规则的监控逻辑,具体修改如下:
核心修改点
- 用规则映射表统一管理监控路径、目标AVI文件、对应执行脚本的关联关系
- 让监控器支持同时注册多组监控规则,每组规则对应独立的事件处理器
- 事件处理器根据触发的文件信息,自动匹配并执行对应的脚本
- 保留递归监控参数,确保子目录的AVI文件也能被捕获
完整实现代码
import time import subprocess import sys from watchdog.observers import Observer from watchdog.events import PatternMatchingEventHandler class RuleHandler(PatternMatchingEventHandler): def __init__(self, target_script): super().__init__( patterns=["*.avi"], ignore_patterns=["*.tmp"], ignore_directories=True, case_sensitive=False, ) self.target_script = target_script def on_created(self, event): # 仅处理文件创建事件,避免重复触发 file_name = event.src_path.split("\\")[-1] # Windows路径分割 # 检查文件名是否匹配规则 if file_name in self.target_script: print(f"[{time.asctime()}] 检测到目标文件: [{event.src_path}]") # 使用sys.executable确保调用当前环境的Python解释器 subprocess.Popen([sys.executable, self.target_script[file_name]]) class MultiWatcher: def __init__(self, rules): self.observer = Observer() self.rules = rules def run(self): for rule in self.rules: handler = RuleHandler(rule["script_map"]) self.observer.schedule(handler, rule["path"], recursive=True) self.observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: self.observer.stop() print("监控已停止") self.observer.join() if __name__ == "__main__": # 定义监控规则:每个规则包含监控路径、文件名到脚本的映射 MONITOR_RULES = [ { "path": "C:/User/AAxxx/video/", "script_map": {"ABxxx_11.avi": "ABxxx_11.py"} }, { "path": "C:/User/BBxxx/video/", "script_map": {"CDxxx_22.avi": "CDxxx_22.py"} }, { "path": "C:/User/CCxxx/video/", "script_map": {"EFxxx_33.avi": "EFxxx_33.py"} } ] watcher = MultiWatcher(MONITOR_RULES) watcher.run()
关键说明
- 规则映射表:
MONITOR_RULES里每个条目对应一组监控逻辑,你可以随时添加或修改规则,无需改动核心代码 - 事件触发时机:使用
on_created而非on_any_event,避免文件修改、删除等无关事件触发脚本 - 脚本执行:用
sys.executable替代硬编码的python,确保使用当前运行环境的Python解释器,避免环境不一致问题 - 递归监控:
schedule方法中设置recursive=True,会自动监控目标路径下的所有子目录
内容的提问来源于stack exchange,提问作者Kukkik
相关产品推荐
相关产品推荐

