PROJET AUTOBLOG


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

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

⇐ retour index

Mise à jour

Mise à jour de la base de données, veuillez patienter...

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

Error happened! 0 - count(): Argument #1 ($value) must be of type Countable|array, null given In: /var/www/ecirtam.net/autoblogs/autoblogs/autoblog.php:428 http://www.ecirtam.net/autoblogs/autoblogs/sametmaxcom_a844ada43a979e3b1395ab9acb6afafb84340999/?R%C3%A9agir-%C3%A0-un-changement-sur-un-fichier-avec-watchdog-1 #0 /var/www/ecirtam.net/autoblogs/autoblogs/autoblog.php(999): VroumVroum_Blog->update() #1 /var/www/ecirtam.net/autoblogs/autoblogs/sametmaxcom_a844ada43a979e3b1395ab9acb6afafb84340999/index.php(1): require_once('...') #2 {main}