You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python watchdog无法监控指定文件问题求助

问题排查与修复方案

1. 监控路径不匹配(最可能触发无响应的原因)

你代码里设了path=".",但打印提示却写着"Watching directory './app'",这里明显矛盾:

  • 要是你在app目录的父文件夹里运行python app/file_monitor.py,那"."指向的是父文件夹,根本监控不到app目录里的文件;
  • 要是你在app目录内运行脚本,"."是对的,但提示信息会误导你。

修复:
直接用脚本所在目录作为监控路径(避免工作目录带来的问题):

path = os.path.abspath(os.path.dirname(__file__))

同时把提示改成和实际监控路径一致:

print(f"File watcher started. Watching directory {path}. Press Ctrl+C to stop.", flush=True)

2. 编辑器保存机制绕过了on_modified事件

很多编辑器(比如VS Code)保存文件时,不是直接修改原文件,而是先创建临时文件再替换原文件,这种操作会触发on_moved或on_created事件,而你的代码只监听了on_modified,所以看不到响应。

修复:
改用on_any_event捕获所有文件事件,再过滤目标文件:

class MyHandler(FileSystemEventHandler):
    def on_any_event(self, event):
        if event.is_directory:
            return
        if event.src_path.endswith(('file1.py', 'file2.py')):
            # 后续逻辑不变

3. 备份目录不存在会触发异常

你代码里直接往./backup复制文件,但如果这个目录不存在,shutil.copy2会抛错,导致后续代码跑不起来,甚至handler直接崩溃。

修复:
复制前先创建备份目录:

backup_dir = './backup'
os.makedirs(backup_dir, exist_ok=True)

4. 输出缓冲导致看不到打印

Python的标准输出默认有缓冲,可能你修改了文件,但print的内容还没显示出来。给print加flush=True强制刷新:

print("this is modified", flush=True)

修复后的完整代码

import os
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import shutil

class MyHandler(FileSystemEventHandler):
    def on_any_event(self, event):
        if event.is_directory:
            return
        if event.src_path.endswith(('file1.py', 'file2.py')):
            print(f'File modified: {event.src_path}', flush=True)
            filename = os.path.basename(event.src_path)
            backup_dir = './backup'
            os.makedirs(backup_dir, exist_ok=True)
            new_path = os.path.join(backup_dir, f"{filename}.backup{time.strftime('%Y%m%d-%H%M%S')}")
            shutil.copy2(event.src_path, new_path)

if __name__ == "__main__":
    event_handler = MyHandler()
    path = os.path.abspath(os.path.dirname(__file__))
    observer = Observer()
    observer.schedule(event_handler, path, recursive=False)
    observer.start()

    try:
        print(f"File watcher started. Watching directory {path}. Press Ctrl+C to stop.", flush=True)
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

内容的提问来源于stack exchange,提问作者Nano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 05:25:33