В настоящее время у меня есть базовый функционирующий сценарий, который отслеживает изменения в одном каталоге и всех подкаталогах ниже и передает вывод в 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 как лучший, потому что он был просто единственным и выявил проблемы с моим исходным кодом.
Мое предыдущее редактирование включало полностью рабочий код для мониторинга нескольких местоположений и, похоже, в настоящее время работает правильно.