gpt4 book ai didi

python 看门狗 : Is there a way to pause the observer?

转载 作者:太空狗 更新时间:2023-10-30 01:34:29 34 4
gpt4 key购买 nike

我正在使用 Watchdog 来监控目录并使其与 Dropbox 保持同步。

我遇到这样一种情况,每次我从 Dropbox 下载文件时,我都会触发一个上传事件,因为我需要写入 Watchdog 正在监控的目录。这是我正在使用的代码。

event_handler = UploadHandler.UploadHandler()
observer = Observer()
observer.schedule(event_handler, path=APP_PATH, recursive=True)
observer.start()

try:
while True:
# Apply download here
time.sleep(20)

except KeyboardInterrupt:
observer.stop()

observer.join()

有没有办法在我应用下载时“暂停”观察者并在我完成后再次“取消暂停”它?

最佳答案

我需要暂停功能,所以我使用以下观察器:

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/modifications.log”。

此功能 appears to be built into pyinotify ,但该库仅适用于 linux,看门狗独立于操作系统。

关于 python 看门狗 : Is there a way to pause the observer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18781239/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com