Сторожевой таймер Python для файлов из двух разных каталогов

Я пытаюсь прослушивать изменения файловой системы с помощью сторожевого модуля Python. Я хочу отслеживать файлы из двух разных каталогов. Для просмотра одного файла я использовал PatternMatchingEventHandler из watchdog.events. Я хочу использовать то же самое для нескольких каталогов.

код:

import time
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler

class EventHandler(PatternMatchingEventHandler):
    def on_modified(self, event):
        super(EventHandler, self).on_modified(event)
        print event

if __name__ == "__main__":
    dir_name = ["/home/user1/first", "/home/user1/second"]
    observer = Observer()
    patterns = ["/home/user1/first/first.log","/home/user1/second/second.log")]
    for i in xrange(len(dir_name)):
        event_handler = EventHandler(patterns = patterns[i])
        observer.schedule(event_handler, dir_name[i], recursive=True)
    observer.start()

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

В приведенном выше коде я попытался выполнить несколько форматов наблюдения за каталогами и создать обработчик событий для каждого из файлов. У меня не работает. Есть ли что-нибудь, чего мне здесь не хватает? Как это сделать ??

Спасибо.


person wonder    schedule 23.06.2017    source источник


Ответы (4)


здесь что-то не так

EventHandler(patterns = patterns[i])

arg patterns - это тип списка, поэтому вы можете использовать его так

patterns = [["/home/user1/first/first.log"], ["/home/user1/second/second.log"]]
EventHandler(patterns = patterns[i])
person 陈晓林    schedule 29.05.2019

Хотя он не использует сторожевую библиотеку, это простой способ просто проверить, добавлены или удалены файлы определенного типа, если вы хотите проверить, какие файлы вы можете добавить, используя любую переменную, и сохранить их в массиве.

    import os
    import fnmatch
    import threading
    import time
    
    initial_count = 0
    flag = 0
    files = []
    
    path = ["/home/kirti/workspace/pythonproject6/img", "/home/kirti/workspace/pythonproject6/copy"]
    
    
    def taskcount(path, flag, initial_count):
        while 1:
            time.sleep(3)
            new_count = len(fnmatch.filter(os.listdir(path), "*.jpg"))
    
            if new_count > initial_count:
    
                if flag != 0:
                    print("Added \nCount :", new_count, "=", path)
                else:
                    print(new_count)
            if new_count < initial_count:
                print("Removed \nCount :", new_count, "=", path)
    
            initial_count = new_count
            flag = 1
    
    
    for j in range(len(path)):
        t = threading.Thread(target=taskcount, args=(path[j], flag, initial_count))
    
        t.start() 
person kitto    schedule 26.10.2020

Я использую python3, ОС LINUX

С незначительной модификацией, как предложено выше, и некоторыми дополнениями из myside, теперь это работает

import time
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler

class EventHandler(PatternMatchingEventHandler):
        def on_modified(self, event):
                super(EventHandler, self).on_modified(event)
                print(event)

if __name__ == "__main__":
        dir_name = ["/home/don/test1", "/home/don/test2"]
        observer = Observer()
        threads=[]
        patterns = [['*.log'],['*.ok']]
        for i in range(len(dir_name)):
                event_handler = EventHandler(patterns = patterns[i],ignore_directories=True,case_sensitive=False)
                observer.schedule(event_handler, dir_name[i], recursive=True)
                threads.append(observer)
        observer.start()

        try:
                while True:
                        time.sleep(0.1)
        except KeyboardInterrupt:
                observer.stop()
        observer.join()
person sakeesh    schedule 19.03.2021

По сравнению с моим, вам не хватает observer.join() на EOF. Попробуй с этим.

ИЗМЕНИТЬ

Попробуйте этот код ниже:

import time
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler

class EventHandler(PatternMatchingEventHandler):
    def on_modified(self, event):
        super(EventHandler, self).on_modified(event)
        print event

if __name__ == "__main__":
    observer = Observer()
    patterns = ["/home/user1/first/first.log","/home/user1/second/second.log"]
    for pattern in patterns:
        event_handler = EventHandler(patterns=pattern)
        observer.schedule(event_handler, dir_name[i], recursive=True)
    observer.start()

    try:
        while True:
            time.sleep(0.1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()
person RompePC    schedule 23.06.2017
comment
Насколько мне известно, блокирует поток, из которого вызывается код, поэтому программа работает бесконечно, пока не завершится (в данном случае с помощью Ctrl-C). Дополнительная информация здесь. Обратите внимание, что он выглядит как черный экран: внесите некоторые изменения, чтобы вы могли видеть, работает ли программа (она будет выведена). - person RompePC; 23.06.2017
comment
Это правильно. Но он вообще ничего не печатает, хотя файлы в обоих каталогах регулярно модифицируются. Я пробовал делать join() для всех планировщиков наблюдателей. Но мне это не помогает. - person wonder; 23.06.2017
comment
Отредактировал сообщение с некоторым кодом, чтобы попробовать. Если по-прежнему не удается, поищите журналы (обычно системный журнал), чтобы узнать, что произойдет. - person RompePC; 23.06.2017