Как инициализировать обработчик событий соответствия шаблону сторожевого таймера Python

Я использую Python Watchdog для мониторинга каталога для создания новых файлов. В указанном каталоге создается несколько разных типов файлов, но мне нужно отслеживать только один тип файлов, поэтому я использую Watchdog PatternMatchingEventHandler, где я указываю шаблон для мониторинга с помощью ключевого слова patterns.

Чтобы правильно выполнить внутренний код (здесь не показан), мне нужно инициализировать пустой фрейм данных в моем обработчике событий, и у меня возникают проблемы с его работой. Если я уберу __init__ в приведенном ниже коде, все будет работать нормально, кстати.

Я использовал код из этого ответа в качестве вдохновения для своего собственного.

Код, который я установил, выглядит следующим образом:

from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler
import time
import pandas as pd
import numpy as np
from multiprocessing import Pool

class HandlerEQ54(PatternMatchingEventHandler):

    def __init__(self):
        #Initializing an empty dataframe for storage purposes.
        data_54 = pd.DataFrame(columns = ['Barcode','DUT','Step12','Step11','Np1','Np2','TimestampEQ54'])
        #Converting to INT for later purposes
        data_54[['Barcode','DUT']]=data_54[['Barcode','DUT']].astype(np.int64)
        self.data = data_54

    def on_created(self,event):
        if event.is_directory:
            return True

        elif event.event_type == 'created':
        #Take action here when a file is created.
            print('Found new files:')
            print(event.src_path)
            time.sleep(0.1)

            #Creating process pool to return data
            pool1 = Pool(processes=4)
            #Pass file to parsing function and return parsed result.
            result_54 = pool1.starmap(parse_eq54,[(event.src_path,self.data)])
            #returns the dataframe rather than the list of dataframes returned by starmap
            self.data = result_54[0]


            print('Data read: ')
            print(self.data)


def monitorEquipment(equipment):
    '''Uses the Watchdog package to monitor the data directory for new files.
    See the HandlerEQ54 and HandlerEQ51 classes in multiprocessing_handlers for actual monitoring code.  Monitors each equipment.'''

    print('equipment')

    if equipment.upper() == 'EQ54':

        event_handler = HandlerEQ54(patterns=["*.log"])
        filepath = '/path/to/first/file/source/'

    # set up observer
    observer = Observer()
    observer.schedule(event_handler, path=filepath, recursive=True)
    observer.daemon=True
    observer.start()
    print('Observer started')
    # monitor
    try:
        while True:
            time.sleep(5)
    except KeyboardInterrupt:
        observer.unschedule_all()
        observer.stop()
    observer.join()

Однако при выполнении monitorEquipment я получаю следующее сообщение об ошибке:

TypeError: __init__() got an unexpected keyword argument 'patterns'

Очевидно, я делаю что-то не так, когда инициализирую свой класс обработчика, но я не понимаю, что это такое (что, вероятно, отражает мое менее чем оптимальное понимание классов). Может ли кто-нибудь посоветовать мне, как правильно инициализировать пустой фрейм данных в моем классе HandlerEQ54, чтобы не получить ошибку, которую я делаю?


person AstroAT    schedule 06.06.2019    source источник


Ответы (1)


Похоже, вам не хватает аргумента patterns в методе __init__, вам также понадобится вызов super() метода __init__ родительского класса (PatternMatchingEventHandler), чтобы вы могли передать аргумент шаблонов вверх.

это должно выглядеть примерно так:

class HandlerEQ54(PatternMatchingEventHandler):

    def __init__(self, patterns=None):
        super(HandlerEQ54, self).__init__(patterns=patterns)
...

event_handler = HandlerEQ54(patterns=["*.log"])

или, для более общего случая и для поддержки всех аргументов PatternMatchingEventHandler:

class HandlerEQ54(PatternMatchingEventHandler):

    def __init__(self, *args, **kwargs):
        super(HandlerEQ54, self).__init__(*args, **kwargs)
...

event_handler = HandlerEQ54(patterns=["*.log"])
person Jon    schedule 19.08.2019