【问题标题】:Watching a directory for file changes with Python does not work用 Python 监视目录中的文件更改不起作用
【发布时间】:2017-09-24 19:00:44
【问题描述】:

我使用这个http://brunorocha.org/python/watching-a-directory-for-file-changes-with-python.html 示例来解决这个任务。它奏效了。 当我没有使用 OOP 时。现在,我正在尝试将我的代码重写为 OOP,我做了什么: 我创建了名为 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)

接下来,我在我的另一个文件中调用它,在那里我有读取 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()

而且,当我尝试调用它时,我有:

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

我哪里出错了?在我进行 OOP 实验之前,我有:

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()

它奏效了。现在,我的脚本不起作用。请帮忙。

【问题讨论】:

    标签: python oop handler file-handling filehandler


    【解决方案1】:

    您没有调用父 (PatternMatchingEventHandler) 对象构造函数

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

    需要调用构造函数来设置一些父类需要的实例变量如_ignore_directories

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-12
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多