Python Watchdog在启动时处理现有文件

问题描述 投票:1回答:1

我有一个简单的看门狗和队列过程来监视目录中的文件。代码取自https://camcairns.github.io/python/2017/09/06/python_watchdog_jobs_queue.html

import time
from watchdog.events import PatternMatchingEventHandler
from watchdog.observers import Observer
from queue import Queue
from threading import Thread

dir_path = "/data"

def process_queue(q):

    while True:
        if not q.empty():
            event = q.get()
            print("New event %s" % event)

        time.sleep(5)


class FileWatchdog(PatternMatchingEventHandler):

    def __init__(self, queue, patterns):
        PatternMatchingEventHandler.__init__(self, patterns=patterns)
        self.queue = queue

    def process(self, event):
        self.queue.put(event)

    def on_created(self, event):
        self.process(event)


if __name__ == '__main__':

    watchdog_queue = Queue()

    worker = Thread(target=process_queue, args=(watchdog_queue,))
    worker.setDaemon(True)
    worker.start()

    event_handler = FileWatchdog(watchdog_queue, patterns="*.ini")
    observer = Observer()
    observer.schedule(event_handler, path=dir_path)
    observer.start()

    try:
        while True:
            time.sleep(2)
    except KeyboardInterrupt:
        observer.stop()

    observer.join()

一旦进程运行,将正确处理新文件。但是,如果我重新启动该过程,并且目录中已经存在文件,则将其忽略。

我已经尝试创建要添加到队列的字典

    for file in os.listdir(dir_path):
        if file.endswith(".ini"):
             file_path = os.path.join(dir_path, file)
             event = {'event_type' : 'on_created', 'is_directory' : 'False', 'src_path' : file_path}
             watchdog_queue.put(event)

但是它期望一个对象类型(类'watchdog.events.FileCreatedEvent'),我不知道如何创建它。

或者,我可以在看门狗文档中看到(类watchdog.utils.dirsnapshot.DirectorySnapshot,但我无法弄清楚如何运行它并将其添加到队列中。

关于如何在启动时将现有文件添加到队列的任何建议?

python queue watchdog python-watchdog
1个回答
0
投票
from watchdog.events import FileCreatedEvent

# loop to get all files dir_path is your lookup folder

for file in os.listdir(dir_path):
    filename = os.path.join(dir_path, file)
    event=FileCreatedEvent(filename)
    watchdog_queue.put(event)
© www.soinside.com 2019 - 2024. All rights reserved.