2017-09-22 1 views
2

予想外のイベントが発生しています。フォルダが作成されたときにPythonウォッチドッグライブラリで複数のイベントが表示される

私は、C:\Users\kvasko\Downloads\dataというフォルダを見ています。私がフォルダをコピーする場合2017\07\25\LogFile.xml私は1つしか見えないと思ったときに、次の3つの "created"イベントが表示されます。(もしアプリケーションがフォルダを見ている間に)私が期待するような一つの出来事。私は、単にフォルダの作成のためのイベントを取得しません。それはイベントがフォルダの作成のために生成されているようですが、私のon_created(self,event)で伝えられた実際のイベントを調べると、3つのルックイベントは全く同じに見えます。ここで何が起こっているのですか?

ここに出力例と最小例を示します。

2017-09-22 13:58:10,182 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data\2017\07\25\LogFile.xml 
2017-09-22 13:58:11,184 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data\2017\07\25\LogFile.xml 
2017-09-22 13:58:12,187 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data\2017\07\25\LogFile.xml 

私が期待する:

2017-09-22 13:58:12,187 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data\2017\07\25\LogFile.xml 

フォルダの作成から、その実際には複数のイベントかどうかを検出する方法はありますか?

私の観察者の構成は次のとおりです。

folder = "C:\\Users\\kvasko\\Downloads\\data" 
observer = Observer(MyProcessHandler(patterns=["*.xml"]), folder, recursive=True) 
observer.start_observer() 

os.mkdirs("C:\\Users\\kvasko\\Downloads\\data\\2017\\07\\25") 
shutil.copy2("C:\temp\LogFile.xml", "C:\\Users\\kvasko\\Downloads\\data\\2017\\07\\25") 

try: 
    while True: 
     time.sleep(5) 
except: 
    print("Error") 

以下は私のハンドラクラスです。

import logging 
from watchdog.events import PatternMatchingEventHandler 

class MyProcessHandler(PatternMatchingEventHandler): 

def on_created(self, event): 
    logging.info("Watchdog: file created " + str(event.src_path)) 

編集:ここでは

が最小作業例です:

import time 
import os 
import shutil 
import datetime 
from watchdog.observers import Observer 
from watchdog.events import PatternMatchingEventHandler 

class TestEventHandler(PatternMatchingEventHandler): 
    def on_created(self, event): 
     print (str(datetime.datetime.now()) + " " + str(event)) 

if __name__ == '__main__': 
    path = "C:\\Temp" 
    event_handler = TestEventHandler(patterns=["*.xml"]) 
    observer = Observer() 
    observer.schedule(event_handler, path, recursive=True) 
    observer.start() 

    os.makedirs("C:\\Temp\\2017\\07\\25") 
    shutil.copy2("C:\\Temp2\\2017\\07\\25\\test.xml", "C:\\Temp\\2017\\07\\25") 

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

プリントアウト:

2017-09-22 15:49:51.334262 <FileCreatedEvent: src_path='C:\\Temp\\2017\\07\\25\\test.xml'> 
2017-09-22 15:49:52.335468 <FileCreatedEvent: src_path='C:\\Temp\\2017\\07\\25\\test.xml'> 
2017-09-22 15:49:53.340998 <FileCreatedEvent: src_path='C:\\Temp\\2017\\07\\25\\test.xml'> 

EDIT2:on_any_eventするon_created

変更()( )。これが生産されたものです。

2017-09-23 13:14:57.288792 <FileCreatedEvent: src_path='C:\\Temp\\2017\\07\\25\\test.xml'> 
2017-09-23 13:14:58.291327 <FileCreatedEvent: src_path='C:\\Temp\\2017\\07\\25\\test.xml'> 
2017-09-23 13:14:59.293334 <FileCreatedEvent: src_path='C:\\Temp\\2017\\07\\25\\test.xml'> 
2017-09-23 13:14:59.293334 <FileModifiedEvent: src_path='C:\\Temp\\2017\\07\\25\\test.xml'> 
+0

いあなたの "LogFile.xml"のコピーは2秒以上話していますか? –

+0

@LaurentLAPORTEいいえ、これらのファイルは100KBのようなものです。 –

+0

@KevinVasko:実行可能な例にするためにコードを変更すると、非常に役に立ちます。 – unutbu

答えて

1

this bugが発生している可能性があります。回避策として、あなたが作成した最後のファイルのパスを記録していないパスが最後に作成したパスよりもまたはそのパスが削除されている場合は異なっている場合を除き、その後のon_createdイベント に応答するTestEventHandlerクラスを使用することができます。

import time 
import os 
import shutil 
import datetime 
from watchdog.observers import Observer 
from watchdog.events import PatternMatchingEventHandler 

class TestEventHandler(PatternMatchingEventHandler): 
    def __init__(self, *args, **kwargs): 
     super(TestEventHandler, self).__init__(*args, **kwargs) 
     self.last_created = None 
    def on_created(self, event): 
     path = event.src_path   
     if path != self.last_created: 
      print(str(datetime.datetime.now()) + " " + str(event)) 
      self.last_created = path 
    def on_deleted(self, event): 
     path = event.src_path 
     if path == self.last_created: 
      self.last_created = None 

if __name__ == '__main__': 

    path = "C:\\Temp" 
    target_dir = "C:\\Temp\\2017\\07\\25" 
    src_dir = "C:\\Temp2\\2017\\07\\25" 
    filename = 'test.xml' 

    target = os.path.join(target_dir, filename) 
    src = os.path.join(src_dir, filename) 

    event_handler = TestEventHandler(patterns=["*.xml"]) 
    observer = Observer() 
    observer.schedule(event_handler, path, recursive=True) 
    observer.start() 

    if not os.path.exists(target_dir): 
     os.makedirs(target_dir) 

    if os.path.exists(target): 
     os.unlink(target) 

    for i in range(3): 
     shutil.copy2(src, target_dir)  

    try: 
     while True: 
      time.sleep(1) 
    except KeyboardInterrupt: 
     observer.stop() 
    observer.join() 
+0

それは問題と思われ、あなたの回避策は完全に機能します!ありがとう、トン。私は答えとしてあなたの解決策をマークしました。 –

関連する問題