2017-01-25 3 views
0

Ich habe ein Skript, das einen Ordner überwacht, um eine Datei zu empfangen. Wenn die Datei NICHT in X-Zeit empfangen wird, möchte ich benachrichtigt werden. Wenn sie empfangen wird, möchte ich das Skript beenden. Ich plane, Windows geplante Aufgabe zu verwenden, um das Skript zu starten/zu stoppen (weil ich nicht weiß, wie man es in Python recycelt). Ich bin derzeit fest auf den Versuch, aus Watchdog/Python zu verlassen, wenn die Datei empfangen wird (da ich nur eine Warnung möchte, wenn es nicht ist).Wie Watchdog/Python-Skript von Handler-Klassenfunktion zu beenden?

In der Handler-Klasse habe ich einen Aufruf der Quitter-Funktion hinzugefügt, wenn der event.event_type erkannt wird. Es wird jedoch nicht beendet und wird bis zum Erreichen des Zeitlimits fortgesetzt.

Hier ist, was ich bisher:

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

Nun, ich glaube nicht, es ist schön, aber ich habe es funktioniert. Ich habe eine globale Variable file_received = False hinzugefügt. Dann setze ich die while-Schleife auf: während nicht file_received (um zu laufen, bis auf True gesetzt). Dann in der Funktion on_any_event habe ich folgendes hinzugefügt: elif event.event_type == 'created': # Datei wurde empfangen, kann jetzt aufhören zu schauen global file_rec file_rec = Wahr quitter() –

Antwort

0

ich hatte das gleiche Problem. Ich löste die Übergabe des Beobachters an den Handler erweiterten Konstruktor

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)