Vous pouvez sous-classer le gestionnaire d'événements watchdog.events.PatternMatchingEventHandler et le modifier pour faire ce que vous voulez dans le cas d'un événement. Vous devez définir le motif comme le nom de fichier que vous souhaitez surveiller.
Cependant, celui-ci est un peu difficile. Sous les couvertures, il utilise pathtools.patterns pour faire sa correspondance de modèle. Et il ajoute également le répertoire au motif correspondant. Ce qui signifie que vous aurez besoin de passer dans le gestionnaire d'événements le chemin complet de votre fichier comme nom de fichier "pattern" argument. Si ce n'est pas le cas, la correspondance de modèle échouera et vous n'obtiendrez aucune notification d'événement.
Voici un exemple ci-dessous:
import sys, os.path, time, logging
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler
class MyEventHandler(PatternMatchingEventHandler):
def on_moved(self, event):
super(MyEventHandler, self).on_moved(event)
logging.info("File %s was just moved" % event.src_path)
def on_created(self, event):
super(MyEventHandler, self).on_created(event)
logging.info("File %s was just created" % event.src_path)
def on_deleted(self, event):
super(MyEventHandler, self).on_deleted(event)
logging.info("File %s was just deleted" % event.src_path)
def on_modified(self, event):
super(MyEventHandler, self).on_modified(event)
logging.info("File %s was just modified" % event.src_path)
def main(file_path=None):
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
watched_dir = os.path.split(file_path)[0]
print 'watched_dir = {watched_dir}'.format(watched_dir=watched_dir)
patterns = [file_path]
print 'patterns = {patterns}'.format(patterns=', '.join(patterns))
event_handler = MyEventHandler(patterns=patterns)
observer = Observer()
observer.schedule(event_handler, watched_dir, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
if __name__ == "__main__":
if len(sys.argv) > 1:
path = sys.argv[1]
main(file_path=path.strip())
else:
sys.exit(1)
exécution du script python de chien de garde (avant de modifier le fichier):
(stackoverflow)[[email protected] stackoverflow]# python watchschedule.py /usr/local/src/stackoverflow/watchdog/schedule.xml
watched_dir = /usr/local/src/stackoverflow/watchdog
patterns = /usr/local/src/stackoverflow/watchdog/schedule.xml
Modification du fichier schedule.xml dans une console séparée:
[[email protected] watchdog]# echo "I just modified this file" >> schedule.xml
Résultats après modification du programme.xml:
(stackoverflow)[[email protected] stackoverflow]# python watchschedule.py /usr/local/src/stackoverflow/watchdog/schedule.xml
watched_dir = /usr/local/src/stackoverflow/watchdog
patterns = /usr/local/src/stackoverflow/watchdog/schedule.xml
2015-08-31 19:30:31 - File /usr/local/src/stackoverflow/watchdog/schedule.xml was just modified
Cela fonctionne comme annoncé, merci. Comment est-ce que je devrais enlever le besoin d'entrer la structure de fichier dans la ligne de commande? Rien ne semble fonctionner. J'ai essayé les trois endroits les plus logiques dans la fonction principale. –
@ElliotRobert Vous pouvez coder en dur le chemin du fichier. Sous la section 'if __name__ ==" __main __ ":', supprimez tout le bloc if-else et remplacez-le par un appel à la fonction 'main()', en passant votre chemin codé en argument à 'main()' . Par exemple: 'main (chemin_fichier = '/ usr/local/src/stackoverflow/watchdog/schedule.xml')' –
Cela ne fonctionnait que pour le répertoire lui-même, y compris le nom de fichier provoquerait une erreur, je devais exécuter le Fonction .strip() sur le chemin d'accès complet avec le nom du fichier pour qu'il fonctionne. Merci un million de Joe. –