66 votes

Détecter un changement de fichier sans interrogation

J'essaie d'utiliser une méthode dans un programme Python pour détecter si un fichier du système de fichiers a été modifié. Je sais que je pourrais faire en sorte que quelque chose s'exécute toutes les 5 secondes pour vérifier la date de dernière modification sur le système, mais je me demandais s'il existait une méthode plus simple pour le faire, sans avoir besoin de demander à mon programme de vérifier de façon répétée.

Quelqu'un connaît-il une telle méthode ?

1 votes

Quelle plateforme ? Windows dispose d'un service système permettant d'enregistrer un rappel lorsqu'un répertoire ou un fichier est modifié.

1 votes

Linux, mais je préférerais que le programme soit compatible avec toutes les plates-formes.

2 votes

Si vous programmez pour Windows, vous pouvez envisager le File System Watcher de .Net. ironpython.info/index.php/Watching_the_FileSystem

80voto

nemith Points 480

chien de garde

Excellente bibliothèque multiplateforme pour l'observation des répertoires.

Extrait du site web

Plateformes prises en charge

  • Linux 2.6 (inotify)

  • Mac OS X (FSEvents, kqueue)

  • FreeBSD/BSD (kqueue)

  • Windows (ReadDirectoryChangesW avec ports d'achèvement d'E/S ; threads de travail ReadDirectoryChangesW)

  • Indépendant du système d'exploitation (interrogation du disque pour obtenir des instantanés de répertoire et comparaison périodique ; lent et non recommandé).

Je l'ai utilisé sur quelques projets et il semble fonctionner à merveille.

0 votes

L'outil en ligne de commande est idéal pour le développement. Merci pour le conseil.

0 votes

D'après l'exemple donné sur le site Web du chien de garde, il semble que cela nécessite une interrogation.

3 votes

@ZauberParacelsus : Ce n'est pas le cas. L'exemple le fait time.sleep(1) pour garder l'exemple en vie, mais watchdog est en fait asynchrone et appellera event_handler en cas d'événement de changement de fichier.

45voto

Aleksi Torhamo Points 1938

Pour linux, il y a pyinotify .

Depuis la page d'accueil :

Pyinotify est un module Python permettant de surveiller les changements dans les systèmes de fichiers. Pyinotify s'appuie sur une fonctionnalité du noyau Linux (fusionnée dans le noyau 2.6.13) appelée inotify. appelée inotify. inotify est un notificateur événementiel notificateur piloté par les événements, ses notifications sont exportées de l'espace noyau noyau vers l'espace utilisateur par le biais de trois appels système. pyinotify lie ces appels appels système et fournit une une implémentation au-dessus d'eux offrant une manière générique et abstraite de de manipuler ces fonctionnalités.

Ainsi, il n'est évidemment pas multiplateforme et dépend d'une version suffisamment récente du noyau. Cependant, pour autant que je puisse voir, exiger le support du noyau serait vrai pour tout mécanisme de non-polling.

0 votes

Peut-on utiliser pyinotify pour détecter le programme spécifique qui a été utilisé pour modifier un fichier ?

2 votes

Est-ce que les objections à son encontre encore valable ?

0 votes

Ce paquet n'existe plus

7voto

otherchirps Points 968

Sous Windows, c'est le cas :

Observateur qui est un joli portage en python de l'API FileSystemWatcher de .NET.

Il y a aussi (celui que j'ai écrit) dirwatch .

Tous deux reposent sur le système Windows ReadDirectoryChangesW fonction. Cependant, pour un travail réel, j'utiliserais la fonction Observateur (extension C correcte, bonne API, support de python 2 et 3).

Le mien est surtout une expérience d'appel des API pertinentes sous Windows, il n'est donc intéressant que si vous voulez un exemple d'appel de ces choses depuis python.

0 votes

Watcher semble avoir été abandonné depuis un certain temps et manque de documentation appropriée.

1 votes

Yep, le paysage a changé depuis 2011... On dirait que le chien de garde est le meilleur pari ces jours-ci.

5voto

AJ00200 Points 1059

Vous devriez également voir inotifyx qui est très similaire au pyinotify mentionné précédemment, mais dont on dit qu'il a une API qui change moins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X