3

我对 Python 还是很陌生,希望这个问题的答案对你们大多数人来说是显而易见的。

我正在 Python 中创建一个代表 ScanFolder 的类。

在该类的 __init__ 中,我启动了 watchdog.observers

每当监视目录下的文件发生更改时,此观察者将触发 watchdog.events.PatternMatchingEventHandler。

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

import sys
import time

from watchdog.observers import Observer
import watchdog.events

path = sys.argv[1] if len(sys.argv) > 1 else '.'

class MyEventHandler(watchdog.events.PatternMatchingEventHandler):
    def on_any_event(self, event):
        print(event.src_path, event.event_type)

class ScanFolder:
    'Class defining a scan folder'

    def __init__(self, path):
        self.path = path
        self.documents = dict() # key = document label   value = Document reference

        self.event_handler = MyEventHandler(patterns=["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.pdf"],
                                        ignore_patterns=[],
                                        ignore_directories=True)
        self.observer = Observer()
        self.observer.schedule(self.event_handler, self.path, recursive=False)
        self.observer.start()

    def stop(self):
        self.observer.stop()
        self.observer.join()

scan_folder = ScanFolder(path)

try:
    while True:
        time.sleep(1)
        """Here, I'll act on my scan_folder object that lists the discovered files"""
except KeyboardInterrupt:
    log.warning("Ouch !!! Keyboard interrupt received.")

scan_folder.stop()

我的问题如下:

我怎样才能让我的 scan_folder 对象被我的 scan_folder.event_handler() 修改?

实际上,我想在扫描文件夹中检测到文件的任何地方填充 scan_folder.documents 字典。

非常感谢您,并为我的无知感到抱歉。

4

1 回答 1

4

有很多方法可以做到:但最简单的方法是将 ScanFolder 的绑定方法设置on_any_eventwatchdog.events.PatternMatchingEventHandler. 所以你的代码变成:

class ScanFolder:
    'Class defining a scan folder'

    def __init__(self, path):
        self.path = path
        self.documents = dict() # key = document label   value = Document reference

        self.event_handler = watchdog.events.PatternMatchingEventHandler(patterns=["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.pdf"],
                                    ignore_patterns=[],
                                    ignore_directories=True)
        self.event_handler.on_any_event = self.on_any_event
        self.observer = Observer()
        self.observer.schedule(self.event_handler, self.path, recursive=False)
        self.observer.start()

    def on_any_event(self, event):
        print(event.src_path, event.event_type)
        print("Complete ScanFolder() access")

    def stop(self):
        self.observer.stop()
        self.observer.join()

其他方法可以从 watchdog.events.PatternMatchingEventHandler 派生 ScanFolder .... 但是注入函数是 python 的强大功能之一

于 2014-10-14T22:03:53.623 回答