0

I used this http://brunorocha.org/python/watching-a-directory-for-file-changes-with-python.html example for resolving of this task. And it worked. When i have not used OOP. Now, i am trying to rewrite my code to OOP, what i did: I created file with name MyHandler.py

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys

from watchdog.events import PatternMatchingEventHandler

class MyHandler(PatternMatchingEventHandler):
    patterns = ["*.xml", "*.lxml"]

    def __init__(self, logger, myfunction):
        self.logger = logger
        self.myfunction = myfunction

    def process(self, event):
        """
        event.event_type
            'modified' | 'created' | 'moved' | 'deleted'
        event.is_directory
            True | False
        event.src_path
            path/to/observed/file
        """
        self.logger.debug("target: {} was {}".format(event.src_path, event.event_type))
        self.myfunction()

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

Next, i am calling this in my other file, where i have function for reading of xml:

observer = Observer()
observer.schedule(MyHandler(self.logger, self.read_xml), path=self.mydir)
observer.start()

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

observer.join()

And, when i am trying to call this i have:

AttributeError: 'MyHandler' object has no attribute '_ignore_directories'

Where i have error ? Before my experiments with OOP, i had:

class MyHandler(PatternMatchingEventHandler):
    patterns = ["*.xml*", "*.lxml"]

    def process(self, event):
        """
        event.event_type
            'modified' | 'created' | 'moved' | 'deleted'
        event.is_directory
            True | False
        event.src_path
            path/to/observed/file
        """
        logger.debug("Target: {} was {}".format(event.src_path, event.event_type))
        read_xml()

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

    if __name__ == "__main__"

        observer = Observer()
        observer.schedule(MyHandler(), path=mydir)
        observer.start()

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

        observer.join()

And it worked. Now, my script does not work. Please help.

Piduna
  • 609
  • 12
  • 28

1 Answers1

0

You are not calling the parent (PatternMatchingEventHandler) object constructor

def __init__(self, logger, myfunction):
    super().__init__() # <--- Put arguments to PatternMatchingEventHandler if constructor here if needed
    self.logger = logger
    self.myfunction = myfunction

The constructor needs to be called to set up some of the instance variables required for the parent class such as _ignore_directories.

GWW
  • 43,129
  • 11
  • 115
  • 108