2017-01-25 43 views
0

私は、受信するファイルのフォルダを見ているスクリプトを持っています。私が警告したいXの時間内にファイルが受信されない場合、受信されたらスクリプトを終了します。私はWindowsのスケジュールされたタスクを使用してスクリプトの開始/停止を計画しています(私はPythonでそれをリサイクルする方法を知らないので)。私は現在、Watchdog/Pythonを終了するときにファイルが受信されたときに止まっています。ハンドラクラス関数からWatchdog/Pythonスクリプトを終了するには?

Handlerクラスでは、event.event_typeが検出された場合に、にquitter関数の呼び出しを追加しました。ただし、タイムアウト値に達するまで終了しません。ここで

は、私がこれまで持っているものです。

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

私はそれがきれいだとは思っていませんが、私はそれを動作させています。私はグローバル変数file_received = Falseを追加しました。それからwhileループを設定します:file_receivedではなく、Trueに設定されるまで実行します。次に、on_any_event関数で次のように追加しました。elif event.event_type == 'created': グローバルファイル_rec file_rec = True quitter() –

答えて

0

私は同じ問題を抱えていました。オブザーバーをハンドラー拡張コンストラクターに渡して解決しました

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) 
関連する問題