Как выйти из сторожевого таймера/скрипта Python из функции класса обработчика?

У меня есть скрипт, который просматривает папку для получения файла. Если файл НЕ получен в течение X времени, я хочу получить предупреждение, если он получен, я хочу выйти из сценария. Я планирую использовать запланированную задачу Windows для запуска/остановки скрипта (потому что я не знаю, как переработать его в Python). В настоящее время я застрял при попытке выйти из Watchdog/Python, КОГДА файл получен (поскольку я хочу только предупреждение, если это не так).

В классе обработчиков я добавил вызов функции выхода, если обнаружен тип события event.event_type. Однако он не завершается и продолжается до тех пор, пока не будет достигнуто значение времени ожидания.

Вот что у меня есть до сих пор:

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import smtplib
import sys

file_rec = False

class Watcher:
    DIRECTORY_TO_WATCH = r"C:\Temp"

    def __init__(self):
        self.observer = Observer()

    def run(self):
        t_end = time.time() + 5 * 3 # Configure timeout value
        global file_rec
        event_handler = Handler()
        self.observer.schedule(event_handler, self.DIRECTORY_TO_WATCH, recursive=False)
        self.observer.start()
        try:
            while not file_rec:
                if time.time() > t_end: # If timeout reached file not created -- send email
                    email()

                else:
                    time.sleep(5)
        except:
            self.observer.stop()
            print("Error")

        self.observer.join()


class Handler(FileSystemEventHandler):

    @staticmethod
    def on_any_event(event):
        if event.is_directory:
            return None

        elif event.event_type == 'created':
            # File has been received, can now quit watching
            global file_rec
            file_rec = True
            quitter()

if __name__ == '__main__':

    def email():
        createMsg = "File XXX on Server XXX has not been received, manual intervention required."
        sender = '[email protected]'
        receiver = '[email protected]'
        message = """From: No Reply <[email protected]>
                            TO: Test User <[email protected]>
                            Subject: File Not Received

                            Attention Required: """ + str(createMsg)
        mail = smtplib.SMTP('email.mydomain.com', 25)
        mail.ehlo()
        #mail.starttls()
        mail.sendmail(sender, receiver, message)
        mail.close()
        quitter()

    def quitter():
        sys.exit()

    w = Watcher()
    w.run()

person Nick Biolo    schedule 25.01.2017    source источник
comment
Ну, я не думаю, что это красиво, но у меня это работает. Я добавил глобальную переменную file_received = False. Затем я устанавливаю цикл while на: while not file_received (для запуска до тех пор, пока не будет установлено значение True). Затем в функцию on_any_event я добавил следующее: elif event.event_type == 'created': # Файл получен, теперь можно прекратить просмотр глобальных файлов file_rec file_rec = True quitter()   -  person Nick Biolo    schedule 26.01.2017


Ответы (1)


У меня такая же проблема. Я решил передать наблюдателя расширенному конструктору обработчика

from watchdog.events import FileSystemEventHandler


class MyHandler(FileSystemEventHandler):
    def __init__(self, observer):
        object.__init__(self)
        self.observer = observer

    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 debug
        self.observer.stop()
        print "stopped"

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

    def on_created(self, event):
        self.process(event)
person venturieffect    schedule 20.06.2017
comment
По какой-то причине он не останавливает цикл while внутри if name ==' - person MehmedB; 13.11.2019