現在、単一のディレクトリとその下のすべてのサブディレクトリの変更を監視し、出力を 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 のおかげで、スレッド開始の問題は修正されましたが、3 つの別々のオブザーバーが異なるパスを監視するのではなく、1 つのインスタンスしか残っていません。私の変更されたコードは次のようになります。
threads = []
for i in paths:
targetPath = str(i)
observer.schedule(event_handler, targetPath, recursive=True)
threads.append(observer)
observer.start()
print threads
これは 3 つの 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 つのパス名すべての変更が出力に反映されているように見えましたが、確認するためにいくつかのテスト コードを記述する必要があります。
これがどのように動作するかはまだわからないので、さらにコメントをいただければ幸いです。
乾杯。
追加 3:
FogleBird の回答は、単に唯一のものであり、最初のコードの問題を強調していたため、最良の回答としてマークしました。
私の以前の編集には、複数の場所を監視するための完全に機能するコードが含まれており、現在は正しく機能しているようです。