Python Watchdog изменен и создан дубликат событий

Работая в Ubuntu, каждый раз, когда я создаю файл, я получаю измененное и созданное событие.

Это дизайн или я делаю что-то не так?

Я использую класс обработчика событий PatternMatchingEventHandler

event_handler = MediaFileHandler(ignore_directories=True) 
observer = Observer() 
observer.schedule(event_handler, path=directory, recursive=True) 
observer.start()

Если это правильное поведение, могу ли я безопасно игнорировать созданное событие?

1 ответ

Решение

Короткий ответ: f = open(... , 'w') генерирует FileCreatedEvent, f.flush() или же f.close() может генерировать FileModifiedEvent, Так что да, создание файла часто генерирует оба FileCreatedEvent а также FileModifiedEvents,

Возможность безопасного игнорирования FileCreatedEvents зависит от того, что вы пытаетесь сделать. Если вы заинтересованы в том, чтобы реагировать каждый раз при создании файла, вам нужно обработать FileCreatedEvents и, возможно, игнорировать FileModifiedEvents, поскольку можно сгенерировать FileModifiedEvents при изменении файла без генерации FileCreatedEvents.

Поиграйте с каноническим сторожевым скриптом (ниже), и все должно быть понятнее.


Длинный ответ: чтобы увидеть, что происходит, запустите программу canonical watchdog прямо из документов:

import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S')
    path = sys.argv[1] if len(sys.argv) > 1 else '.'
    event_handler = LoggingEventHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

И из терминала:

% mkdir ~/tmp
% cd ~/tmp
% script.py 

Теперь в интерпретаторе Python, когда вы открываете файл в w Режим:

In [126]: f = open('/home/unutbu/tmp/foobar', 'w')

Терминал печатает

2014-02-05 16:29:34 - <FileCreatedEvent: src_path=/home/unutbu/tmp/foobar>

При записи в файл сторожевой таймер не сообщает ни о каком событии:

In [127]: f.write('Hi')

Но когда ты смеешь,

In [128]: f.flush()

он сообщает FileModifiedEvent:

2014-02-05 16:29:55 - <FileModifiedEvent: src_path=/home/unutbu/tmp/foobar>

Если вы напишите больше материала в файл:

In [129]: f.write(' there')

Точно так же FileModifiedEvent сообщается, когда вы закрываете файл, так как дополнительные выходные данные записываются на диск:

In [130]: f.close()

2014-02-05 16:30:12 - <FileModifiedEvent: src_path=/home/unutbu/tmp/foobar>
Другие вопросы по тегам