binarydogs binarydogs - 1 year ago 488
Python Question

Generating multiple observers with Python watchdog

I currently have a basic functioning script that monitors a single directory and all sub-directories below for changes and passes the output to the LoggingEventHandler.

I now want to expand my script to monitor 3 separate locations but I simply can't grasp how to generate multiple Observers to watch each of my designated paths.

I attempted something along the lines of the following:

import time
import thread
import threading
from watchdog.observers import Observer
from 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)

Unfortunately I received an error indicating that observer doesn't have an attribute 'start_new_thread'

There is no example within the documentation that shows more than a single observer monitoring a directory. I have no experience of dealing with threads and I'm not even sure if I am on the right track.

Should I be creating a new instance of the observer class for each path instead? Or is there some method of feeding a single instance of the Observer class, multiple paths?

Apologies if there is a glaringly obvious answer. I am sure this is all completely wrong now, I am just too tired to understand.


Thanks to @FogleBird I have corrected the thread start issue but I am still stuck with only a single instance rather than three separate observers watching the different paths. My altered code now looks like:

threads = []

for i in paths:
targetPath = str(i)
observer.schedule(event_handler, targetPath, recursive=True)

print threads

This returns three ObservedWatch objects but they all have the same details:

[<Observer(Thread-1, started daemon 1548)>, <Observer(Thread-1, started daemon 1548)>, <Observer(Thread-1, started daemon 1548)>]

Still looks completely wrong, any more help would be great. I am struggling to grasp this concept.


I have continued mucking about with the code and I now have something that appears to be functional:

event_handler = LoggingEventHandler()
N2watch = Observer()
threads = []

for i in paths:
targetPath = str(i)
N2watch.schedule(event_handler, targetPath, recursive=True)


while True:
except KeyboardInterrupt:

From what I can gather from an initial run the output appeared to pickup changes in all three of the path names specified in my list but I will need to write some test code to check.

I am still not certain how this is behaving so any further comments would be great.



I marked FogleBird's answer as the best because it was simply the only one and did highlight issues with my initial code.

My previous edit included fully working code to monitor multiple locations and appears to be functioning correctly at present.

Answer Source

The example code here shows a function called start, not start_new_thread. Have you tried that?

Also, you should probably call start just once, after the for loop, not inside of it.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download