簡體   English   中英

Python Watchdog 在啟動時處理現有文件

[英]Python Watchdog process existing files on startup

我有一個簡單的 Watchdog 和 Queue 進程來監視目錄中的文件。 代碼取自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()

一旦進程運行,新文件就會被正確處理。 但是,如果我重新啟動進程並且目錄中已經存在一個文件,它將被忽略。

我試圖創建一個 dict 來添加到隊列中

    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 文檔(類 watchdog.utils.dirsnapshot.DirectorySnapshot)中看到,但我無法弄清楚如何運行它並將其添加到隊列中。

關於如何在啟動時將現有文件添加到隊列的任何建議?

此代碼應該完成您想要實現的目標。

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)

我偶然發現了同樣的問題,也許這個解決方案也適合你。 至少在 linux 上,這很有效。

添加“on_modified”方法

class FileWatchdog(PatternMatchingEventHandler):

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

...

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

現在啟動觀察者后,循環遍歷目錄中的所有文件並“觸摸”它們,因此它們將被“修改”。

# 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)
    os.popen(f'touch {filename}')

無需添加特殊過濾器,因為您的 FileHandler 會處理它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM