Как правильно запустить RegexMatchingEventHandler Watchdog?

Я работаю над небольшим инструментом для GameApi. Этот API работает с .log-файлами. Они предоставляются в определенном месте. Я хочу наблюдать за этим местоположением с помощью сторожевого таймера, и он работает нормально, если я использую PatternMatchingEventHandler. Но если я использую RegexMatchingEventHandler, это не удастся. Я хочу использовать Regex, потому что есть много .log-файлов, и я хочу проверить файлы только с сегодняшнего дня.

Расширение: я использую Watchdog с функциями:

on_created
on_deleted
on_moved
on_modified

На этом веб-сайте показан код, который я использую: https://www.thepythoncorner.com/2019/01/how-to-create-a-watchdog-in-python-to-look-for-filesystem-changes/

Я обычно тестировал свою функцию Regex с помощью re. Это абсолютно нормально. Но даже если я попробую запись регулярного выражения: ['\w+.log'], это не сработает.

Я предоставляю вам свое регулярное выражение, чтобы понять, что я хочу сделать:

regexes = ["^Journal\.190901\d{6}\.\d{2}\.log$"]

Я ожидал сообщения каждый раз, когда я изменяю один из моих .log-файлов, но это происходит только в том случае, если я использую PatternMatchingEventHAndle

РЕДАКТИРОВАТЬ: Теперь я представляю вам мой минимальный пример:

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

if __name__ == "__main__":
    regexes = ["^Journal\.190901\d{6}\.\d{2}\.log$"]
    ignore_regexes= []
    ignore_directories = False
    case_sensitive = True
    my_event_handler = RegexMatchingEventHandler(regexes,ignore_regexes,ignore_directories,case_sensitive)

    def on_modified(event):
        print(f"hey buddy, {event.src_path} has been modified")

    my_event_handler.on_modified = on_modified

# Observer
    path = "."
    go_recursively = True
    my_observer = Observer()
    my_observer.schedule(my_event_handler, path, recursive=go_recursively)

    my_observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        my_observer.stop()
        my_observer.join()

person MaKaNu    schedule 01.09.2019    source источник


Ответы (1)


Речь идет как раз о шаблоне пути, возвращаемого обработчиком событий, он начинается с пути к корню папки, указанной в path (path = "." в вашем примере).

  • Это может помочь проверить любые шаблоны возвращаемых путей и проверить, что именно вам нужно:

    regexes = ['.+']  # will match everything 
    
  • Чтобы отслеживать файлы в текущем каталоге с помощью path = ".":

    # linux (example path : ./Journal[...].log)
    regexes = ['^\./Journal\.190901\d{6}\.\d{2}\.log$']
    
    # windows (example path : .\Journal[...].log)
    regexes = ["^\.\\\\Journal\.190901\d{6}\.\d{2}\.log$"]
    
    # both
    regexes = ["^\.(/|\\\\)Journal\.190901\d{6}\.\d{2}\.log$"]
    
  • если вы определяете подпапку с именем logs и указываете корень, например path = "logs"

    # (example path : logs/Journal[...].log or logs\Journal[...].log
    regexes = ['^logs(/|\\\\)logs/Journal\.190901\d{6}\.\d{2}\.log$']
    
person PRMoureu    schedule 02.09.2019
comment
Хорошо, я понимаю, что с путем. Этот код работает в системе Windows, нужно ли мне делать что-то особенное? Чтобы получить правильный путь, я использую: from pathlib import Path - person MaKaNu; 02.09.2019
comment
хм, я думал об этом, я попробовал это на Linux, какой путь возвращается, если вы используете ['.+']? я не уверен, как он обрабатывает обратную косую черту в путях Windows. - person PRMoureu; 02.09.2019
comment
это тоже было моей мыслью. Как я могу прочитать вывод ['.+']. я должен сделать это с импортом повторно? - person MaKaNu; 02.09.2019
comment
я предлагал заменить ваш текущий regexes = ["^Journal\.190901\d{6}\.\d{2}\.log$"], чтобы проверить, какой шаблон возвращается в окнах - person PRMoureu; 02.09.2019
comment
Ах Хорошо, да, это работает. С .log и .txt, как и ожидалось. И просто чтобы упомянуть, что я тестировал свое регулярное выражение с тестером регулярных выражений раньше. - person MaKaNu; 02.09.2019
comment
но я не понимаю, почему мое полное регулярное выражение не работает. - person MaKaNu; 03.09.2019
comment
Можешь попробовать regexes = ["\.\\\\Journal\.190901\d{6}\.\d{2}\.log$"] ? В противном случае regexes = [".+Journal\.190901\d{6}\.\d{2}\.log$"] тоже может работать - person PRMoureu; 03.09.2019
comment
Я сейчас на работе и проверяю это, если я дома. Я хочу проверить разные файлы по одному и тому же шаблону: все они начинаются с журнала. за которой следует дата, когда файл был записан, например 190901, с фактической отметкой времени, которая не имеет значения для шаблона 010101.01, а файлы заканчиваются на .log. Все вместе: Journal.190901010101.01.log - person MaKaNu; 03.09.2019
comment
Это сработало для обоих. Я не понимаю, почему вы должны использовать 4 обратных слэша в первом регулярном выражении, но большое спасибо. Тем не менее Windows странная :) Я отредактирую ваш awnser, чтобы отметить его как решение. Я вижу, ты уже это сделал. - person MaKaNu; 03.09.2019
comment
рад, что это работает ;) Regex может быть таким же странным, как и Windows, чтобы написать буквальную обратную косую черту, вы должны использовать 4 (docs.python.org/3/library/re.html) - person PRMoureu; 03.09.2019