看门狗运行功能一次

问题描述 投票:0回答:1

下面是我的看门狗脚本。在Vim中修改文件时,将触发删除然后创建的事件。 This is expected.

这会导致问题。我希望它忽略通过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()
python watchdog
1个回答
0
投票

为了更好地理解问题,我对您的代码做了一些修改。

...
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功能中的LoggingEventHandler替换为main,它将生成事件日志。在修改目录“ ./file”中的文本文件时,生成的日志如下:

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
© www.soinside.com 2019 - 2024. All rights reserved.