Я нуждался задержавшись функциональность поэтому я использую следующий наблюдатель:
import time
import contextlib
import watchdog.observers
class PausingObserver(watchdog.observers.Observer):
def dispatch_events(self, *args, **kwargs):
if not getattr(self, '_is_paused', False):
super(PausingObserver, self).dispatch_events(*args, **kwargs)
def pause(self):
self._is_paused = True
def resume(self):
time.sleep(self.timeout) # allow interim events to be queued
self.event_queue.queue.clear()
self._is_paused = False
@contextlib.contextmanager
def ignore_events(self):
self.pause()
yield
self.resume()
Затем я могу приостановить наблюдатель непосредственно с pause()
и resume()
методами, но мой основной случай использования, когда я просто хочу игнорировать любые события, вызванные записью в каталоге я наблюдаю, за которую я использую менеджер контекста:
import os
import datetime
import watchdog.events
class MyHandler(watchdog.events.FileSystemEventHandler):
def on_modified(self, event):
with OBSERVER.ignore_events():
with open('./watchdir/modifications.log', 'a') as f:
f.write(datetime.datetime.now().strftime("%H:%M:%S") + '\n')
if __name__ == '__main__':
watchdir = 'watchdir'
if not os.path.exists(watchdir):
os.makedirs(watchdir)
OBSERVER = PausingObserver()
OBSERVER.schedule(MyHandler(), watchdir, recursive=True)
OBSERVER.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
OBSERVER.stop()
OBSERVER.join()
Вы можете проверить это путем сохранения обоих блоков кода в файле, запустив его, и добавление/редактирование/удаление файлов в созданный каталог 'watchdir'. Временные метки ваших модификаций будут добавлены к 'watchdir/changes.log'.
Эта функциональность appears to be built into pyinotify, но эта библиотека работает только в Linux, а сторожевой таймер не зависит от ОС.
У меня подобная проблема, и я смотрю на Observer api, чтобы попытаться понять это: https://github.com/gorakhargosh/watchdog/blob/master/src/watchdog/observers/api.py – grammar31