2013-11-15 45 views
7

私は現在、単一のディレクトリとその下位のすべてのサブディレクトリを監視し、出力をLoggingEventHandlerに渡す基本的な機能スクリプトを持っています。Pythonウォッチドッグを使用して複数のオブザーバを生成する

私は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」を持っていない

を受けディレクトリを監視する1人以上の観察者を示しています。私はスレッドを扱う経験がなく、私が正しい道にいるかどうかは分かりません。

代わりに、各パスのオブザーバークラスの新しいインスタンスを作成する必要がありますか?またはObserverクラスの複数のパスを1つのインスタンスに追加する方法がいくつかありますか?

わかりやすい回答がある場合はお詫び申し上げます。私は今これが完全に間違っていると確信しています、私はあまりにも疲れて理解できません。

追加:私は、スレッドの開始の問題を修正してきたが、私はまだ単一のインスタンスだけではなく、異なるパスを見て3つの別々のオブザーバーで立ち往生しています@FogleBirdへ

感謝。私の変更されたコードは次のようになります。

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

はまだそれ以上のヘルプは素晴らしいことだ、完全に間違って見えます。私はこのコンセプトを理解するのに苦労しています。

ADDITIONAL 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の答えをマーク。

私の以前の編集には、複数の場所を監視するための完全な作業コードが含まれており、現在正しく機能しているようです。

+0

これに修正がありますか?私は同じことを実装しようとしています。 – majidarif

+0

こんにちは - はい、上記のコードの最後のセクションが機能していることが証明されました。 ADDITIONAL 2というセクションの下にあるものはすべて私のために働いていました。 – binarydogs

答えて

4

ここのコード例は、ではなくstartという関数を示しています。あなたはそれを試しましたか?

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

また、あなたはおそらくない、それの内側に、forループの後、一度だけstartを呼び出す必要があります。

+2

ありがとう@FogleBirdドキュメントを読んでいたときに、どこで 'code'start_new_thread'code 'をどこで選んだのか分かりません。 – binarydogs

1

このスレッドは古くなっていますが、正確なものを探している間に見つけたので、作業を拡張し、見るディレクトリのリストをファイルに渡す機能を追加しました。デフォルトでは、私は再帰的に見ていません。テストするために他の人にそれを残します。うまくいけば、これは誰でも同じ話題を探しているのに役立ちます。すごい仕事! watcher.pyは、私は私のスクリプトとファイル名が私のパスとファイルの名前で呼んだものであるPythonのwatcher.pyファイル名

を使用して

ラン。

私は、ファイル内の完全なパスを一覧表示し、これらは改行 すなわち、

Cで分離されている:\パス2 \の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() 
1
パス1
C \

ちょっとしたメモを追加したい:

コードのスレッディングのlibとスレッドのリストは、ちょうど星の人のためにちょっと混乱することがありますウォッチドッグを使って(私自身も含めて)。これらは実際にはソリューションには必要ありません。

  • 1人のオブザーバー
  • スケジュール複数
  • 「イベントを見て」を作成し、オブザーバを開始します。それだけで説明する簡単な方法。

これだけです。