Как ввести имя файла в качестве шаблона в Watchdog - PullRequest
0 голосов
/ 21 февраля 2019

Допустим, у меня есть код как таковой

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

class MyHandler(PatternMatchingEventHandler):
    patterns = ["*/file.txt"]

    def process(self, event):
        """
        event.event_type 
            'modified' | 'created' | 'moved' | 'deleted'
        event.is_directory
            True | False
        event.src_path
            path/to/observed/file
        """
        # the file will be processed there
        print event.src_path, event.event_type  # print now only for degug
        if event.event_type == 'modified':
            print fname


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

if __name__ == '__main__':
#    args = sys.argv[1:]
    fname = 'file.txt'
    observer = Observer()
    observer.schedule(MyHandler(), path='.')
    observer.start()

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

    observer.join()

Моя цель состоит в том, чтобы пользователь ввел имя fname в переменную patterns в классе MyHandler.

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

class MyHandler(PatternMatchingEventHandler):
    patterns = ["*/"+fname]

    def process(self, event):
        """
        event.event_type 
            'modified' | 'created' | 'moved' | 'deleted'
        event.is_directory
            True | False
        event.src_path
            path/to/observed/file
        """
        # the file will be processed there
        print event.src_path, event.event_type  # print now only for degug
        if event.event_type == 'modified':
            print fname


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

if __name__ == '__main__':
#    args = sys.argv[1:]
    fname = 'file.txt'
    observer = Observer()
    observer.schedule(MyHandler(), path='.')
    observer.start()

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

    observer.join()

Я что-то пробовалкак упоминалось выше, но это не сработало.Это говорит fname is not defined.Ну ладно, я попробовал patterns = [].append("*/"+fname) тоже безуспешно.

Затем я попытался создать функцию инициализации

def __init__(fname):
    self.patterns = [].append("*/"+fname)

и прошел как observer.schedule(MyHandler(fname), path='.')

Облом!Также нет успеха.Как мне этого добиться?

1 Ответ

0 голосов
/ 21 февраля 2019

Вы можете использовать fnmatch.fnmatch для сопоставления путей к файлам с шаблонами оболочки:

In [72]: import fnmatch
In [77]: fnmatch.fnmatch('/root/path/foo', '*/foo')
Out[77]: True

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

class MyHandler(PatternMatchingEventHandler):

    def init(self, patterns):
        self.patterns = ["*/"+pat for pat in patterns]

    def process(self, event):
        """
        event.event_type 
            'modified' | 'created' | 'moved' | 'deleted'
        event.is_directory
            True | False
        event.src_path
            path/to/observed/file
        """
        path = event.src_path
        print event.src_path, event.event_type  # print now only for degug        
        if any(fnmatch.fnmatch(path, pat) for pat in self.patterns):
            # the file will be processed there
            if event.event_type == 'modified':
                print(fname)

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

if __name__ == '__main__':
    args = sys.argv[1:]
    observer = Observer()
    observer.schedule(MyHandler(args), path='.')
    observer.start()

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

    observer.join()
...