创建文件夹时使用 Python 看门狗库查看多个事件
Seeing multiple events with Python watchdog library when folders are created
我遇到了一些问题,我看到了我不希望发生的其他事件。
我正在观看文件夹 C:\Users\kvasko\Downloads\data
。如果我复制一个文件夹 2017\LogFile.xml
,我将看到以下 3 个 "created" 事件,而我预计只会看到 1 个。如果我提前创建日期文件夹结构(但应用程序 运行 观看文件夹)它只会像我预期的那样生成一个事件。我从来没有得到一个文件夹创建的事件。这就像为创建文件夹而生成的事件,但是当检查我 on_created(self,event)
上消息的实际事件时,所有三个外观事件看起来完全相同。这是怎么回事?
这是示例输出和最小示例。
2017-09-22 13:58:10,182 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data17\LogFile.xml
2017-09-22 13:58:11,184 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data17\LogFile.xml
2017-09-22 13:58:12,187 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data17\LogFile.xml
我预计:
2017-09-22 13:58:12,187 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data17\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")
以下是我的handlerclass.
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'>
编辑2:
将 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'>
您可能正在经历 this bug。作为解决方法,您可以使用 TestEventHandler
class 来记录最后创建的文件路径并且不响应后续的 on_created
事件
除非该路径与上次创建的路径不同或者该路径已被删除:
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()
我遇到了一些问题,我看到了我不希望发生的其他事件。
我正在观看文件夹 C:\Users\kvasko\Downloads\data
。如果我复制一个文件夹 2017\LogFile.xml
,我将看到以下 3 个 "created" 事件,而我预计只会看到 1 个。如果我提前创建日期文件夹结构(但应用程序 运行 观看文件夹)它只会像我预期的那样生成一个事件。我从来没有得到一个文件夹创建的事件。这就像为创建文件夹而生成的事件,但是当检查我 on_created(self,event)
上消息的实际事件时,所有三个外观事件看起来完全相同。这是怎么回事?
这是示例输出和最小示例。
2017-09-22 13:58:10,182 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data17\LogFile.xml
2017-09-22 13:58:11,184 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data17\LogFile.xml
2017-09-22 13:58:12,187 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data17\LogFile.xml
我预计:
2017-09-22 13:58:12,187 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data17\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")
以下是我的handlerclass.
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'>
编辑2:
将 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'>
您可能正在经历 this bug。作为解决方法,您可以使用 TestEventHandler
class 来记录最后创建的文件路径并且不响应后续的 on_created
事件
除非该路径与上次创建的路径不同或者该路径已被删除:
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()