bin*_*ogs 12 python class watchdog
我目前有一个基本功能脚本,它监视单个目录和下面所有子目录的更改,并将输出传递给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()
Run Code Online (Sandbox Code Playgroud)
不幸的是我收到一个错误,表明观察者没有属性'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
Run Code Online (Sandbox Code Playgroud)
这将返回三个ObservedWatch对象,但它们都具有相同的详细信息:
[<Observer(Thread-1, started daemon 1548)>, <Observer(Thread-1, started daemon 1548)>, <Observer(Thread-1, started daemon 1548)>]
Run Code Online (Sandbox Code Playgroud)
仍然看起来完全错误,任何更多的帮助将是伟大的.我正在努力抓住这个概念.
附加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()
Run Code Online (Sandbox Code Playgroud)
根据我从初始运行中收集的内容,输出似乎在我的列表中指定的所有三个路径名中进行拾取更改,但是我需要编写一些测试代码来检查.
我仍然不确定这是如何表现所以任何进一步的评论都会很棒.
干杯.
附加3:
我将FogleBird的答案标记为最佳,因为它只是唯一一个并且突出了我初始代码的问题.
我之前的编辑包括完全正常工作的代码,用于监控多个位置,目前看起来运行正常.
小智 6
只是想添加一些注释:
对于刚开始使用 watchdog 的人(包括我自己)来说,代码中的线程库和线程列表可能有点令人困惑。它们实际上在解决方案中不是必需的。一个简单的解释方法就是:
就是这样。
这里的示例代码显示了一个名为的函数start,而不是start_new_thread.你试过吗?
https://pypi.python.org/pypi/watchdog
此外,你应该start只在for循环之后调用一次,而不是在其中.
好问题。该线程较旧,但我在查找确切内容时发现了它,因此我扩展了您的工作并添加了传递带有目录列表的文件的功能,以供观看。默认情况下,我不进行递归查找,而是将其留给其他人进行测试。希望这可以帮助任何查找相同主题的人。做得好!
使用python watcher.py文件名运行
watcher.py是我所谓的脚本,文件名是带有路径的文件的名称。
我列出了文件中的完整路径,并用换行符隔开,即
C:\ path1
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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6209 次 |
| 最近记录: |