Sam & Max » watchdog http://sametmax.com Du code, du cul Sat, 07 Nov 2015 10:56:13 +0000 en-US hourly 1 http://wordpress.org/?v=4.1 Réagir à un changement sur un fichier avec watchdog 14 http://sametmax.com/reagir-a-un-changement-sur-un-fichier-avec-watchdog/ http://sametmax.com/reagir-a-un-changement-sur-un-fichier-avec-watchdog/#comments Mon, 13 Jul 2015 08:53:42 +0000 http://sametmax.com/?p=16607
  • Faire un backup
  • Lancer les tests unittaires
  • Démarrer un build
  • Recharger un contenu
  • Envoyer un email
  • Afficher une notification
  • Mettre à jour un listing
  • ...
  • ]]>
    Il 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.


    Télécharger le code de l’article

    ]]>
    http://sametmax.com/reagir-a-un-changement-sur-un-fichier-avec-watchdog/feed/ 14