Сторожевая функция запускается один раз - PullRequest
0 голосов
/ 26 апреля 2020

Ниже приведен мой сторожевой скрипт. При изменении файла в 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

Vim настроен таким образом, что временные файлы не сохраняются в рабочем каталоге.

1 Ответ

0 голосов
/ 26 апреля 2020

Чтобы лучше понять проблему, я немного изменил ваш код.

...
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
...