Surveillez votre système de fichiers avec le chien de garde de Python

Surveillez votre système de fichiers avec le chien de garde de Python


Image par auteur | DALLE-3 & Canva

La bibliothèque de surveillance de Python facilite la surveillance de votre système de fichiers et répond automatiquement à ces modifications. Watchdog est une API multiplateforme qui vous permet d’exécuter des commandes en réponse à toute modification du système de fichiers surveillé. Nous pouvons définir des déclencheurs sur plusieurs événements tels que la création, la modification, la suppression et le déplacement de fichiers, puis répondre à ces modifications avec nos scripts personnalisés.

Configuration pour le chien de garde

Vous aurez besoin de deux modules pour commencer :

  • Chien de garde: Exécutez cette commande ci-dessous dans le terminal pour installer le chien de garde.

  • Enregistrement: Il s’agit d’un module Python intégré, il n’est donc pas nécessaire de l’installer en externe.

Utilisation de base

Créons un simple script « main.py » qui surveille un répertoire et imprime un message chaque fois qu’un fichier est créé, modifié ou supprimé.

Étape 1 : Importer les modules requis

Tout d’abord, importez les modules nécessaires depuis la bibliothèque de surveillance :

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

Étape 2 : Définir la classe du gestionnaire d’événements

Nous définissons une classe MyHandler qui hérite de FileSystemEventHandler. Cette classe remplace les méthodes telles que on_modified, on_created et on_deleted pour spécifier quoi faire lorsque ces événements se produisent. L’objet gestionnaire d’événements sera averti lorsque des modifications se produiront dans le système de fichiers.

class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        print(f'File {event.src_path} has been modified')

    def on_created(self, event):
        print(f'File {event.src_path} has been created')

    def on_deleted(self, event):
        print(f'File {event.src_path} has been deleted')

Quelques méthodes utiles de FileSystemEventHandler sont expliqués ci-dessous.

  • sur_any_event : Exécuté pour tout événement.
  • on_created : Exécuté lors de la création d’un nouveau fichier ou répertoire.
  • on_modified : Exécuté lors de la modification d’un fichier ou lorsqu’un répertoire est renommé.
  • on_deleted : Déclenché lors de la suppression d’un fichier ou d’un répertoire.
  • on_moved : Déclenché lorsqu’un fichier ou un répertoire est déplacé.

Étape 3 : initialiser et exécuter l’observateur

La classe Observer est chargée de suivre le système de fichiers pour détecter toute modification et d’en informer ensuite le gestionnaire d’événements. Il suit en permanence les activités du système de fichiers pour détecter toute mise à jour.

if __name__ == "__main__":
    event_handler = MyHandler()
    observer = Observer()
    observer.schedule(event_handler, path=".", recursive=True)
    observer.start()

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

Nous démarrons l’observateur et utilisons une boucle pour le faire fonctionner. Lorsque vous souhaitez l’arrêter, vous pouvez l’interrompre avec un signal clavier (Ctrl+C).

Étape 4 : Exécutez le script

Enfin, exécutez le script avec la commande suivante.

Sortir:

File .File1.txt has been modified
File .New Text Document (2).txt has been created
File .New Text Document (2).txt has been deleted
File .New Text Document.txt has been deleted

Le code ci-dessus enregistrera toutes les modifications apportées au répertoire sur le terminal si un fichier/dossier est créé, modifié ou supprimé.

Utilisation avancée

Dans l’exemple suivant, nous explorerons comment configurer un système qui détecte toute modification dans les fichiers Python et exécute automatiquement des tests. Nous devons installer pytest avec la commande suivante.

Étape 1 : Créer un projet Python simple avec des tests

Tout d’abord, établissez la structure de base de votre projet :

my_project/
│
├── src/
│   ├── __init__.py
│   └── example.py
│
├── tests/
│   ├── __init__.py
│   └── test_example.py
│
└── watchdog_test_runner.py

Étape 2 : écrire du code dans un exemple de fichier Python

Créez un module Python simple dans src/example.py :

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

Étape 3 : rédiger les cas de test

Ensuite, écrivez les cas de test pour les fonctions dans tests/test_example.py :

import pytest
from src.example import add, subtract

def test_add():
    assert add(1, 2) == 3
    assert add(-1, 1) == 0
    assert add(-1, -1) == -2

def test_subtract():
    assert subtract(2, 1) == 1
    assert subtract(1, 1) == 0
    assert subtract(1, -1) == 2

Étape 4 : Écrivez le script de surveillance

Maintenant, créez le script watchdog_test_runner.py pour surveiller les modifications dans les fichiers Python et exécuter automatiquement les tests :

import time
import subprocess
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class TestRunnerHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if event.src_path.endswith('.py'):
            self.run_tests()

    def run_tests(self):
        try:
            result = subprocess.run(['pytest'], check=False, capture_output=True, text=True)
            print(result.stdout)
            print(result.stderr)
            if result.returncode == 0:
                print("Tests passed successfully.")
            else:
                print("Some tests failed.")
        except subprocess.CalledProcessError as e:
            print(f"Error running tests: {e}")

if __name__ == "__main__":
    path = "."  # Directory to watch
    event_handler = TestRunnerHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    
    observer.start()
    print(f"Watching for changes in {path}...")

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    
    observer.join()

Étape 5 : Exécutez le script de surveillance

À la fin, ouvrez un terminal, accédez au répertoire de votre projet (my_project) et exécutez le script de surveillance :

python watchdog_test_runner.py

Sortir:

Watching for changes in ....
========================= test session starts =============================
platform win32 -- Python 3.9.13, pytest-8.2.1, pluggy-1.5.0
rootdir: F:Web Devwatchdog
plugins: anyio-3.7.1
collected 2 items

teststest_example.py ..                                                 [100%]

========================== 2 passed in 0.04s ==============================

Tests passed successfully.

Cette sortie montre que tous les cas de test sont réussis après que des modifications ont été apportées au fichier example.py.

Résumé

La bibliothèque de surveillance de Python est un outil puissant pour surveiller votre système de fichiers. Que vous automatisiez des tâches, synchronisiez des fichiers ou créiez des applications plus réactives, watchdog permet de réagir facilement aux modifications du système de fichiers en temps réel. Avec seulement quelques lignes de code, vous pouvez commencer à surveiller les répertoires et à gérer les événements pour rationaliser votre flux de travail.

Kanwal Mehreen Kanwal est un ingénieur en apprentissage automatique et un rédacteur technique passionné par la science des données et l’intersection de l’IA et de la médecine. Elle a co-écrit l’ebook « Maximiser la productivité avec ChatGPT ». En tant que Google Generation Scholar 2022 pour l’APAC, elle défend la diversité et l’excellence académique. Elle est également reconnue comme boursière Teradata Diversity in Tech, boursière Mitacs Globalink Research et boursière Harvard WeCode. Kanwal est un ardent défenseur du changement, ayant fondé FEMCodes pour autonomiser les femmes dans les domaines STEM.

Source