Überwachen Sie Ihr Dateisystem mit Pythons WatchdogÜberwachen Sie Ihr Dateisystem mit Pythons Watchdog
Bild vom Autor | DALLE-3 & Canva

Mit der Watchdog-Bibliothek von Python können Sie Ihr Dateisystem ganz einfach überwachen und automatisch auf Änderungen reagieren. Watchdog ist eine plattformübergreifende API, mit der Sie Befehle als Reaktion auf Änderungen im überwachten Dateisystem ausführen können. Wir können Auslöser für mehrere Ereignisse wie Dateierstellung, -änderung, -löschung und -verschiebung festlegen und dann mit unseren benutzerdefinierten Skripten auf diese Änderungen reagieren.

Einrichten für Watchdog

Zum Einstieg benötigen Sie zwei Module:

  • Überwachung: Führen Sie den folgenden Befehl im Terminal aus, um den Watchdog zu installieren.

  • Protokollierung: Es handelt sich um ein integriertes Python-Modul, es muss additionally nicht extern installiert werden.

Grundlegende Verwendung

Erstellen wir ein einfaches Skript „important.py“, das ein Verzeichnis überwacht und eine Meldung ausgibt, wenn eine Datei erstellt, geändert oder gelöscht wird.

Schritt 1: Erforderliche Module importieren

Importieren Sie zunächst die erforderlichen Module aus der Watchdog-Bibliothek:

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

Schritt 2: Eventhandler-Klasse definieren

Wir definieren eine Klasse MyHandler, die von FileSystemEventHandler erbt. Diese Klasse überschreibt Methoden wie on_modified, on_created und on_deleted, um anzugeben, was zu tun ist, wenn diese Ereignisse auftreten. Das Eventhandlerobjekt wird benachrichtigt, wenn Änderungen im Dateisystem auftreten.

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

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

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

Einige nützliche Methoden zur FileSystemEventHandler werden im Folgenden erläutert.

  • bei_jedem_Ereignis: Wird für jedes Ereignis ausgeführt.
  • bei_erstellt: Wird beim Erstellen einer neuen Datei oder eines neuen Verzeichnisses ausgeführt.
  • bei_Änderung: Wird ausgeführt, wenn eine Datei geändert oder ein Verzeichnis umbenannt wird.
  • beim_löschen: Wird durch das Löschen einer Datei oder eines Verzeichnisses ausgelöst.
  • beim_Verschieben: Wird ausgelöst, wenn eine Datei oder ein Verzeichnis verschoben wird.

Schritt 3: Initialisieren und Ausführen des Observers

Die Observer-Klasse ist dafür verantwortlich, das Dateisystem auf Änderungen zu überwachen und anschließend den Ereignishandler zu benachrichtigen. Sie überwacht kontinuierlich die Aktivitäten des Dateisystems, um Aktualisierungen zu erkennen.

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

    attempt:
        whereas True:
            time.sleep(1)
    besides KeyboardInterrupt:
        observer.cease()
    observer.be part of()

Wir starten den Beobachter und verwenden eine Schleife, um ihn am Laufen zu halten. Wenn Sie ihn stoppen möchten, können Sie ihn mit einem Tastatursignal unterbrechen (Ctrl+C).

Schritt 4: Führen Sie das Skript aus

Führen Sie abschließend das Skript mit dem folgenden Befehl aus.

Ausgabe:

File .File1.txt has been modified
File .New Textual content Doc (2).txt has been created
File .New Textual content Doc (2).txt has been deleted
File .New Textual content Doc.txt has been deleted

Der obige Code protokolliert alle Änderungen im Verzeichnis im Terminal, wenn eine Datei/ein Ordner erstellt, geändert oder gelöscht wird.

Erweiterte Nutzung

Im folgenden Beispiel werden wir untersuchen, wie man ein System einrichtet, das jede Änderung in Python-Dateien erkennt und automatisch Exams dafür ausführt. Wir müssen pytest mit dem folgenden Befehl installieren.

Schritt 1: Erstellen Sie ein einfaches Python-Projekt mit Exams

Richten Sie zunächst die Grundstruktur Ihres Projekts ein:

my_project/
│
├── src/
│   ├── __init__.py
│   └── instance.py
│
├── assessments/
│   ├── __init__.py
│   └── test_example.py
│
└── watchdog_test_runner.py

Schritt 2: Code in Beispiel-Python-Datei schreiben

Erstellen Sie ein einfaches Python-Modul in src/instance.py:

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

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

Schritt 3: Schreiben Sie die Testfälle

Schreiben Sie als Nächstes die Testfälle für Funktionen in assessments/test_example.py:

import pytest
from src.instance 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

Schritt 4: Schreiben Sie das Watchdog-Skript

Erstellen Sie jetzt das Skript watchdog_test_runner.py, um Änderungen in Python-Dateien zu überwachen und automatisch Exams auszuführen:

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

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

    def run_tests(self):
        attempt:
            consequence = subprocess.run(('pytest'), test=False, capture_output=True, textual content=True)
            print(consequence.stdout)
            print(consequence.stderr)
            if consequence.returncode == 0:
                print("Exams handed efficiently.")
            else:
                print("Some assessments failed.")
        besides subprocess.CalledProcessError as e:
            print(f"Error operating assessments: {e}")

if __name__ == "__main__":
    path = "."  # Listing to look at
    event_handler = TestRunnerHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    
    observer.begin()
    print(f"Waiting for adjustments in {path}...")

    attempt:
        whereas True:
            time.sleep(1)
    besides KeyboardInterrupt:
        observer.cease()
    
    observer.be part of()

Schritt 5: Führen Sie das Watchdog-Skript aus

Öffnen Sie am Ende ein Terminal, navigieren Sie zu Ihrem Projektverzeichnis (my_project) und führen Sie das Watchdog-Skript aus:

python watchdog_test_runner.py

Ausgabe:

Waiting for adjustments in ....
========================= check session begins =============================
platform win32 -- Python 3.9.13, pytest-8.2.1, pluggy-1.5.0
rootdir: F:Internet Devwatchdog
plugins: anyio-3.7.1
collected 2 gadgets

teststest_example.py ..                                                 (100%)

========================== 2 handed in 0.04s ==============================

Exams handed efficiently.

Diese Ausgabe zeigt, dass alle Testfälle bestanden wurden, nachdem Änderungen an der Datei instance.py vorgenommen wurden.

Zusammenfassen

Die Watchdog-Bibliothek von Python ist ein leistungsstarkes Device zur Überwachung Ihres Dateisystems. Ob Sie nun Aufgaben automatisieren, Dateien synchronisieren oder reaktionsschnellere Anwendungen erstellen, mit Watchdog können Sie problemlos in Echtzeit auf Änderungen am Dateisystem reagieren. Mit nur wenigen Codezeilen können Sie mit der Überwachung von Verzeichnissen und der Verarbeitung von Ereignissen beginnen, um Ihren Arbeitsablauf zu optimieren.

Kanwal Mehreen Kanwal ist Ingenieurin für maschinelles Lernen und technische Autorin mit einer tiefen Leidenschaft für Datenwissenschaft und die Schnittstelle zwischen KI und Medizin. Sie ist Mitautorin des E-Books „Maximizing Productiveness with ChatGPT“. Als Google Technology Scholar 2022 für APAC setzt sie sich für Vielfalt und akademische Exzellenz ein. Sie ist außerdem als Teradata Range in Tech Scholar, Mitacs Globalink Analysis Scholar und Harvard WeCode Scholar anerkannt. Kanwal ist eine leidenschaftliche Verfechterin des Wandels und hat FEMCodes gegründet, um Frauen in MINT-Fächern zu stärken.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert