PROJET AUTOBLOG


Sam & Max: Python, Django, Git et du cul

Site original : Sam & Max: Python, Django, Git et du cul

⇐ retour index

Réagir à un changement sur un fichier avec watchdog 14

lundi 13 juillet 2015 à 10:53

Il y a des tas de choses qu’on peut vouloir faire au moment où un fichier change :

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.


Télécharger le code de l’article