2017-09-22 5 views
2

기대하지 않는 추가 이벤트가 발생하는 문제가 있습니다.폴더를 만들 때 파이썬 워치 독 라이브러리로 여러 이벤트보기

나는 C:\Users\kvasko\Downloads\data 폴더를보고있다. 폴더를 복사하는 경우 2017\07\25\LogFile.xml 다음과 같은 3 개의 "만든"이벤트가 표시됩니다. 1 일 때만 예상됩니다. 미리 날짜 폴더 구조를 만들면 (폴더를보고있는 응용 프로그램이 실행되는 동안) 생성됩니다 내가 기대하는 한 가지 사건. 나는 단지 폴더 생성을위한 이벤트를 얻지 못한다. 그것은 이벤트가 폴더 생성을 위해 생성되는 것과 비슷하지만, 내 on_created(self,event)에 메시지로 표시된 실제 이벤트를 검사 할 때 세 가지 모양 이벤트가 모두 똑같이 보입니다. 여기서 무슨 일이 일어나고있는거야?

다음은 샘플 출력과 최소 예입니다.

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_created() on_any_event하는 (). 이것은 생산 된 것입니다.

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

문제가있는 것으로 보이고 해결 방법이 완벽하게 작동합니다! 엄청 고마워. 당신의 답을 답으로 표시했습니다. –