我目前有一个基本的脚本,监视单个目录及其所有子目录的变化,并将输出传递给LoggingEventHandler。
现在我想扩展我的脚本以监视3个不同的位置,但我无法理解如何生成多个观察者来监视我指定的每个路径。
我尝试了以下类似的方法:
import time
import thread
import threading
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler
event_handler = LoggingEventHandler()
observer = Observer()
paths = ["C:\dir1", "C:\dir2", "C:\dir3"]
for i in paths:
targetPath = str(i)
observer.schedule(event_handler, targetPath, recursive=True)
observer.start_new_thread()
不幸的是,我收到了一个错误提示,指出观察者没有 'start_new_thread' 属性。
文档中没有展示超过单个观察者监测目录的例子。我没有处理线程的经验,甚至不确定我是否走在了正确的道路上。
我应该为每个路径创建观察者类的新实例吗?还是有一些方法可以将 Observer 类的单个实例馈送给多个路径?
如果有一个显而易见的答案,请原谅我的无知。我确定现在所有这些都是错误的,但我太累了,无法理解。
附加信息:
感谢@FogleBird,我已经纠正了线程启动问题,但我仍然卡在只有一个实例而不是三个不同观察者监测不同路径的情况。我修改后的代码现在看起来像:
threads = []
for i in paths:
targetPath = str(i)
observer.schedule(event_handler, targetPath, recursive=True)
threads.append(observer)
observer.start()
print threads
这会返回三个ObservedWatch对象,但它们的细节都相同:
[<Observer(Thread-1, started daemon 1548)>, <Observer(Thread-1, started daemon 1548)>, <Observer(Thread-1, started daemon 1548)>]
看起来仍然完全不对,任何更多的帮助都将是极好的。我很难理解这个概念。
附加 2:
我继续摆弄代码,现在我有了一个似乎是可用的东西:
event_handler = LoggingEventHandler()
N2watch = Observer()
threads = []
for i in paths:
targetPath = str(i)
N2watch.schedule(event_handler, targetPath, recursive=True)
threads.append(N2watch)
N2watch.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
N2watch.stop()
N2watch.join()
根据初步运行结果,我认为输出似乎捕捉到了我列表中指定的所有三个路径名称的更改,但我需要编写一些测试代码来进行检查。
我仍然不确定它的表现如何,所以任何进一步的评论都会很好。
谢谢。
附加3:
我将FogleBird的答案标记为最佳答案,因为那是唯一一个,并且确实强调了我初始代码中的问题。
我的上一个编辑包含完全工作的代码,用于监视多个位置,并且目前似乎正常运行。