Réagir à un changement sur un fichier avec watchdog 14
lundi 13 juillet 2015 à 10:53Il y a des tas de choses qu’on peut vouloir faire au moment où un fichier change :
- Faire un backup;
- Lancer les tests unittaires;
- Démarrer un build;
- Recharger un contenu;
- Envoyer un email;
- Afficher une notification;
- Mettre à jour un listing.
Et ce n’est même pas dur à faire en Python grace à la lib watchdog :
pip install watchdog |
D’abord, on créer un handler, une classe qui va contenir le code à lancer quand il arrive quelque chose à nos fichiers :
from watchdog.events import FileSystemEventHandler class MonHandler(FileSystemEventHandler): # cette méthode sera appelée à chaque fois qu'un fichier # est modifié def on_modified(self, event): print("Ah, le fichier %s a été modifé" % event.src_path) # On peut aussi implémenter les méthodes suivantes : # - on_any_event(self, event) # - on_moved(self, event) # - on_created(self, event) # - on_deleted(self, event) # - on_modified(self, event) |
Ensuite on créé un observer, qui va lancer un thread dans lequel il va… observer :
from watchdog.observers import Observer observer = Observer() # Surveiller récursivement tous les événements du dossier /tmp # et appeler les méthodes de MonHandler quand quelque chose # se produit observer.schedule(MonHandler(), path='/tmp', recursive=True) |
On démarre tout ça :
import time observer.start() # L'observer travaille dans un thread séparé donc on fait une # boucle infinie pour maintenir le thread principal # actif dans cette démo mais dans un vrai programme, # vous mettez votre taff ici. try: while True: time.sleep(1) except KeyboardInterrupt: # Ctrl + C arrête tout observer.stop() # on attend que tous les threads se terminent proprement observer.join() |
Pour les ones shot, watchdog vient avec la commande watchmedo
qui permet de lancer un commande shell en cas d’événement :
# lancer 'echo lefichier' pour chaque fichier python ou texte modifié de mon dossier utilisateur watchmedo shell-command --patterns="*.py;*.txt" --recursive --command='echo "${watch_src_path}"' /home/sam |
Personnellement j’aime le lundi.