首页 > 解决方案 > 看门狗运行功能一次

问题描述

下面是我的看门狗脚本。在 Vim 中修改文件时,会触发删除然后创建的事件。这是意料之中的。

这导致了问题。我希望它忽略使用 Vim 修改文件时的已删除事件并运行修改后的函数,但在实际删除文件时运行已删除的函数。

在不改变我的 Vim 配置的情况下这可能吗?

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

WATCH_PATH = './files'

class Handler(FileSystemEventHandler):
    def on_any_event(self, event):
        if event == 'modified':
            modified(event.src_path)
        if event == 'created':
            created(event.src_path)
        if event == 'deleted':
            deleted(event.src_path)

def modified(src):
    print(src, 'modified')

def created(src):
    print(src, 'created')

def deleted(src):
    print(src, 'deleted')

if __name__ == "__main__":
    eh = Handler()
    observer = Observer()
    observer.schedule(eh, path=WATCH_PATH, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

日志

2020-04-26 03:47:02 - Deleted file: ./files/a.txt
2020-04-26 03:47:02 - Modified directory: ./files
2020-04-26 03:47:10 - Created file: ./files/a.txt
2020-04-26 03:47:10 - Modified directory: ./files

维姆

Vim 被配置为临时文件不存储在工作目录中。

标签: pythonwatchdog

解决方案


为了更好地理解这个问题,我稍微修改了你的代码。

...
from watchdog.events import FileSystemEventHandler, LoggingEventHandler
...

if __name__ == "__main__":
  # eh = Handler()
  eh = LoggingEventHandler()

  logging.basicConfig(level=logging.INFO,
                      format='%(asctime)s - %(message)s',
                      datefmt='%Y-%m-%d %H:%M:%S')

  observer = Observer()
  ...

在函数中替换FileSystemEventHandler为,它将生成事件日志。在修改目录 './file' 中的文本文件时,生成的日志如下:LoggingEventHandlermain

2020-04-26 12:41:25 - Created file: ./files/b.txt~
2020-04-26 12:41:25 - Modified directory: ./files
2020-04-26 12:41:25 - Modified file: ./files/b.txt~
2020-04-26 12:41:25 - Modified file: ./files/b.txt
2020-04-26 12:41:25 - Modified file: ./files/b.txt
2020-04-26 12:41:25 - Deleted file: ./files/b.txt~
2020-04-26 12:41:25 - Modified directory: ./files

这里删除的文件是b.txt~中间文件,而不是您的原始文件。所以你只需要过滤掉中间文件的事件。

这是修复的代码:

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler, LoggingEventHandler

WATCH_PATH = './files'

class Handler(FileSystemEventHandler):

    def on_any_event(self, event):

        if str(event.src_path).endswith("~"):
            return None

        if event.event_type == 'modified':
            modified(event.src_path)
        elif event.event_type == 'created':
            created(event.src_path)
        elif event.event_type == 'deleted':
            deleted(event.src_path)

def modified(src):
    print(src, 'modified')

def created(src):
    print(src, 'created')

def deleted(src):
    print(src, 'deleted')

if __name__ == "__main__":
    eh = Handler()

    observer = Observer()
    observer.schedule(eh, path=WATCH_PATH, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        print("Stopping the observer...")
        observer.stop()
    observer.join()

输出:

./files modified
./files/b.txt modified
./files modified

推荐阅读