我需要暂停功能,所以我正在使用以下观察者:
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)
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 / modifications.log”中。
这个功能似乎是内置在pyinotify中的
(链接),但是该库只适用于Linux,而watchdog是独立于操作系统的。