web-dev-qa-db-fra.com

python fichier de surveillance du chien de garde pour les modifications

Mes amis, j'ai besoin de regarder un fichier journal pour les changements. Après avoir parcouru les questions de stackoverflow, je vois des gens recommander "chien de garde". J'essaie donc de tester, et je ne sais pas où ajouter le code lorsque les fichiers changent:

#!/usr/bin/python
import time
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler

if __== "__main__":
    event_handler = LoggingEventHandler()
    observer = Observer()
    observer.schedule(event_handler, path='.', recursive=False)
    observer.start()
    try:
        while True:
            time.sleep(1)
        else:
            print "got it"
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

Où dois-je ajouter le "got it", dans la boucle while si les fichiers ont été ajoutés/modifiés?

46
Cmag

Au lieu de LoggingEventHandler définissez votre gestionnaire:

#!/usr/bin/python
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler


class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        print(f'event type: {event.event_type}  path : {event.src_path}')


if __== "__main__":
    event_handler = MyHandler()
    observer = Observer()
    observer.schedule(event_handler, path='/data/', recursive=False)
    observer.start()

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

on_modified est appelé lorsqu'un fichier ou un répertoire est modifié.

94
alecxe

Voici un extrait pour l'empêcher de s'exécuter deux fois comme d'autres l'ont commenté dans la réponse @alecxe:

from datetime import datetime, timedelta

class MyHandler(FileSystemEventHandler):
    def __init__(self):
        self.last_modified = datetime.now()

    def on_modified(self, event):
        if datetime.now() - self.last_modified < timedelta(seconds=1):
            return
        else:
            self.last_modified = datetime.now()
        print(f'Event type: {event.event_type}  path : {event.src_path}')
        print(event.is_directory) # This attribute is also available
2
run_the_race