gpt4 book ai didi

python - 使用 Python watchdog 生成多个观察者

转载 作者:太空狗 更新时间:2023-10-29 18:05:27 25 4
gpt4 key购买 nike

我目前有一个基本的功能脚本,它监视单个目录和下面的所有子目录的更改并将输出传递给 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 的答案标记为最佳答案,因为它是唯一的答案,并且确实突出了我初始代码的问题。

我之前的编辑包括用于监控多个位置的完整工作代码,目前看来运行正常。

最佳答案

好问题。该线程较旧,但我在查找确切内容时发现了它,并且我扩展了您的工作并添加了传递包含要监视的目录列表的文件的功能。默认情况下,我不会递归地查看,我将其留给其他人进行测试。希望这可以帮助任何查找相同主题的人。干得好!

使用 python watcher.py 文件名运行。

watcher.py 是我调用的脚本,filename 是包含我的路径的文件名。

我列出了文件中的完整路径,这些路径用换行符分隔。

即:

C:\path1
C:\Path2\subpath1
C:\PATH3

watcher.py

import logging
import sys
import time
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler

# Attach a logging event AKA FileSystemEventHandler
event_handler = LoggingEventHandler()

# Create Observer to watch directories
observer = Observer()

# Take in list of paths. If none given, watch CWD
paths = open(sys.argv[1], 'r') if len(sys.argv) > 1 else '.'

# Empty list of observers
observers = []

# Base logging configuration
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')

# Iterate through paths and attach observers
for line in paths:

# Convert line into string and strip newline character
targetPath = str(line).rstrip()

# Schedules watching of a given path
observer.schedule(event_handler, targetPath)

# Add observable to list of observers
observers.append(observer)

# Start observer
observer.start()

try:
while True:

# Poll every second
time.sleep(1)

except KeyboardInterrupt:
for o in observers:
o.unschedule_all()

# Stop observer if interrupted
o.stop()

for o in observers:

# Wait until the thread terminates before exit
o.join()

关于python - 使用 Python watchdog 生成多个观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19991033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com