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>