使用Python监视程序生成多个观察者

2024-05-12 21:15:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在有一个基本的运行脚本,它监视单个目录和下面所有子目录的更改,并将输出传递给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()

不幸的是,我收到一个错误,指出observer没有“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

这将返回三个观察到的监视对象,但它们都具有相同的详细信息:

[<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的答案标记为最好的,因为它只是唯一的一个,并且突出了我的初始代码的问题。

我以前的编辑包含了监视多个位置的完整工作代码,目前看来运行正常。


Tags: 代码import路径eventtruestartobserver观察者
3条回答

好问题。这个线程比较老,但我在查找确切的内容时发现了它,我扩展了您的工作,并添加了传递带有目录列表的文件的功能。默认情况下,我不会递归地查找,而是由其他人来测试。希望这有助于任何人查找相同的主题。干得好!

使用python watcher.py文件名运行

其中watcher.py是我所称的脚本,file name是文件名和路径。

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

C:\路径1
C: \Path2\subpath1
C: \PATH3

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()

只想加上几条:

代码中的线程库和线程列表对于刚开始使用watchdog(包括我自己)的人来说可能有点混乱。它们实际上不是解决方案中所必需的。一个简单的解释是:

  • 创建一个观察者
  • 安排多个“观看活动”
  • 启动观察者。

就这样。

这里的示例代码显示了一个名为start,而不是start_new_thread的函数。你试过了吗?

https://pypi.python.org/pypi/watchdog

另外,您可能应该在for循环之后调用start一次,而不是在循环内部。

相关问题 更多 >