Python watchdog未触发所有事件

6 投票
1 回答
4287 浏览
提问于 2025-04-18 01:26

我正在尝试使用 watchdog 来监控一些文本文件的修改情况,但我发现只收到 .tmp 文件的事件。我知道这是因为 sublime text 在保存文件时的处理方式,但我不应该也能收到实际文件的事件吗?

这是我在 sublime text 中尝试保存文件时,在 /home/john/resources/css/style.css 这个位置看到的内容:

/home/john/resources/css/.sublaa.tmp
/home/john/resources/css/.sublaa.tmp
/home/john/resources/css/.sublaa.tmp

看起来我只收到了 .tmp 文件的事件,而没有收到实际文件的事件。在 MacOSX 上这个功能正常,但在 Ubuntu 上却不行。

#!/usr/bin/python
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler


class MyHandler(FileSystemEventHandler):
    def on_any_event(self, event):
        print event.src_path

if __name__ == "__main__":
    event_handler = MyHandler()
    observer = Observer()
    observer.schedule(event_handler, path='.', recursive=False)
    observer.start()

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

1 个回答

2

这是一个常见的问题,主要出现在一些编辑器创建临时文件的时候。在watchdog这个包的页面(https://pypi.python.org/pypi/watchdog)上,有一段关于Vim的说明:

关于在像Vim这样的编辑器中使用watchdog

Vim不会自动修改文件,除非你特别指示它去做。它会先创建备份文件,然后再用这些备份文件替换你正在编辑的文件。这就意味着,如果你用Vim来编辑文件,watchdog就不会检测到这些文件的修改事件。你可能需要对Vim进行一些设置,以关闭这个功能。

在Sublime中,如果想要关闭临时文件的创建,你需要进入“偏好设置” --> “用户设置”,然后禁用原子保存功能。

"atomic_save": false

撰写回答