2012-08-09 14 views
14

Estoy tratando de detectar cuándo se crea un archivo con un nombre dado en un directorio. Lo estoy haciendo gracias al watchdog. La creación se detecta correctamente, pero no sé cómo finalizar la aplicación correctamente una vez que se realiza la detección.Detectar la creación de archivos con watchdog

Mi pieza de código es el siguiente:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import logging 
import sys 
import time 

from watchdog.events import FileSystemEventHandler 
from watchdog.observers import Observer 

logging.basicConfig(level=logging.ERROR) 

class MyEventHandler(FileSystemEventHandler): 
    def __init__(self, observer, filename): 
     self.observer = observer 
     self.filename = filename 

    def on_created(self, event): 
     print "e=", event 
     if not event.is_directory and event.src_path.endswith(self.filename): 
      print "file created" 
      self.observer.unschedule_all() 
      self.observer.stop() 

def main(argv=None): 
    path = argv[1] 
    filename = argv[2] 

    observer = Observer() 
    event_handler = MyEventHandler(observer, filename) 

    observer.schedule(event_handler, path, recursive=False) 
    observer.start() 
    observer.join() 

    return 0 

if __name__ == "__main__": 
    sys.exit(main(sys.argv)) 

Soy nuevo en Python y no puedo entender lo que está mal. La detección parece estar programada en un subproceso dedicado y el método join() está esperando a que este subproceso finalice. Por lo tanto, supongo que no estoy llamando al método correcto sobre el observador para que deje de esperar/bucles, pero la documentación del perro guardián parece no ser clara para indicar cuáles son los métodos que se pueden usar.

¿Alguien tiene una idea de cómo puedo lograr mi objetivo?

Respuesta

11

Finalmente, después de echar un vistazo a la implementación de watchdog, no es necesario llamar al unschedule_all antes de stop, esto se hace automáticamente. La eliminación de la línea que contiene este método soluciona el problema y la aplicación funciona perfectamente.

+0

Gracias por publicar esta actualización – jgyou

Cuestiones relacionadas