【发布时间】:2013-11-15 00:08:01
【问题描述】:
我目前有一个基本功能脚本,用于监视单个目录和下面的所有子目录的更改并将输出传递给 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()
从我从初始运行中收集到的信息来看,输出似乎显示了列表中指定的所有三个路径名的变化,但我需要编写一些测试代码来检查。
我仍然不确定这是如何表现的,所以任何进一步的 cmets 都会很棒。
干杯。
附加 3:
我将 FogleBird 的答案标记为最佳答案,因为它只是唯一一个并且确实突出了我最初代码的问题。
我之前的编辑包括用于监控多个位置的完整工作代码,并且目前似乎运行正常。
【问题讨论】:
-
您找到解决方法了吗?我正在尝试实现同样的事情。
-
嗨 - 是的,上面帖子中的最后一段代码证明是有效的。标记为“附加 2”的部分下方的所有内容都对我有用。