Python watchdog: игнорирование повторяющихся событий - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь настроить сторожевой таймер, чтобы отслеживать изменения в файлах JavaScript. Но вы всегда получаете повторяющиеся события при изменении одного файла.

Я хочу настроить его так, чтобы при изменении файла он смотрел на время события и, если он был такой же секундой, как и предыдущее событие, он ничего не делал. Таким образом, он может игнорировать повторяющиеся события. Есть ли способ достичь этого и всегда хранить время предыдущего события в переменной?

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


class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        print(time.ctime(), f'path : {event.src_path}')


if __name__ == "__main__":
    event_handler = MyHandler()
    observer = Observer()
    observer.schedule(event_handler, path=path.join(path.dirname(__file__), 'static/js'), recursive=False)
    observer.start()

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

1 Ответ

0 голосов
/ 07 ноября 2018

Один наивный способ сделать это - сохранить файлы / даты в словаре, а затем проверить, находится ли источник времени / файлов в словаре, перед обработкой события.

class MyHandler(FileSystemEventHandler):
    file_cache = {}

    def on_modified(self, event):
        seconds = int(time.time())
        key = (seconds, event.src_path)
        if key in self.file_cache:
            return
        self.file_cache[key] = True
        # Process the file

Если вас беспокоит количество событий, вы можете попробовать использовать cachetools для кэширования результатов, чтобы словарь оставался немного меньше.

...