¿Cómo ejecutar una función cuando algo cambia en un directorio con Python Watchdog?

Estoy tratando de usar watchdog para ejecutar un script de sincronización cada vez que algo cambia en un directorio (a excepción de un archivo específico). Simplemente copié el código del archivo Léame (pegado a continuación), que hace lo que dice; registrar qué archivo ha cambiado.

import sys import time import logging from watchdog.observers import Observer from watchdog.events import LoggingEventHandler if __name__ == "__main__": logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') path = sys.argv[1] if len(sys.argv) > 1 else '.' event_handler = LoggingEventHandler() observer = Observer() observer.schedule(event_handler, path, recursive=True) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() 

Ahora quiero ejecutar una función (que sincroniza toda la carpeta con una máquina remota) siempre que algo cambie. Así que acabo de reemplazar event_handler con mi propia función. Pero eso me da el siguiente error:

 Traceback (most recent call last): File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner self.run() File "/Library/Python/2.7/site-packages/watchdog/observers/api.py", line 199, in run self.dispatch_events(self.event_queue, self.timeout) File "/Library/Python/2.7/site-packages/watchdog/observers/api.py", line 368, in dispatch_events handler.dispatch(event) AttributeError: 'function' object has no attribute 'dispatch' 

¿Alguien sabe lo que estoy haciendo mal aquí? Todos los consejos son bienvenidos!

PD. También quiero excluir un archivo de la carpeta para que no se vea. ¿Alguna idea de cómo debo hacer eso?

Necesitas subclasificar y hacer lo que quieras en el envío:

 import sys import time import logging from watchdog.observers import Observer from watchdog.events import LoggingEventHandler class Event(LoggingEventHandler): def dispatch(self, event): print("Foobar") if __name__ == "__main__": logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') path = sys.argv[1] if len(sys.argv) > 1 else '.' event_handler = Event() observer = Observer() observer.schedule(event_handler, path, recursive=True) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() 

Si ejecuta el código, verá que se Foobar cada vez que se detecta un cambio, para ignorar los archivos que necesita usar [events.PatternMatchingEventHandler] [1]. Hay varios métodos en cada uno

Para hacer algo cuando se modifica un caso, podemos anular on_modified :

 class Event(LoggingEventHandler): def on_modified(self, event): print("Doh") 

Y ejecutar el código usando la clase anterior con event_handler = Event() y cambiar un archivo dará como resultado algo como:

 Doh Doh Doh Doh Doh Doh Doh 2015-10-03 15:33:55 - Created file: ./test.txt___jb_bak___ 2015-10-03 15:33:55 - Moved file: from ./test.txt to ./test.txt___jb_old___ 2015-10-03 15:33:55 - Moved file: from ./test.txt___jb_bak___ to ./test.txt 2015-10-03 15:33:55 - Deleted file: ./test.txt___jb_old___ Doh 

[1]: http://pythonhosted.org/watchdog/api.html#watchdog.events.PatternMatchingEventHandler EventHandler clase que puede anular, todo depende de lo que desee hacer. La clase LoggingEventHandler es una subclase de watchdog.events.FileSystemEventHandler :

Bases de la clase watchdog.events.FileSystemEventHandler : objeto

 Base file system event handler that you can override methods from. 

dispatch (evento) distribuye eventos a los métodos apropiados.

 Parameters: event (FileSystemEvent) – The event object representing the file system event. 

on_any_event (event) Controlador de eventos Catch-all.

 Parameters: event (FileSystemEvent) – The event object representing the file system event. 

on_created (evento) Se invoca cuando se crea un archivo o directorio.

 Parameters: event (DirCreatedEvent or FileCreatedEvent) – Event representing file/directory creation. 

on_deleted (evento) Se invoca cuando se elimina un archivo o directorio.

 Parameters: event (DirDeletedEvent or FileDeletedEvent) – Event representing file/directory deletion. 

on_modified (evento) Se llama cuando se modifica un archivo o directorio.

 Parameters: event (DirModifiedEvent or FileModifiedEvent) – Event representing file/directory modification. 

on_moved (evento) Llamado cuando un archivo o directorio se mueve o cambia de nombre.

 Parameters: event (DirMovedEvent or FileMovedEvent) – Event representing file/directory movement.