J'ai un fichier journal en cours d'écriture par un autre processus que je souhaite surveiller pour les modifications. Chaque fois qu'un changement se produit, j'aimerais lire les nouvelles données pour y effectuer un traitement.
Quelle est la meilleure façon de procéder? J'espérais qu'il y aurait une sorte de crochet de la bibliothèque PyWin32. J'ai trouvé la win32file.FindNextChangeNotification
fonction mais je ne sais pas comment lui demander de regarder un fichier spécifique.
Si quelqu'un a fait quelque chose comme ça, je serais vraiment reconnaissant d'entendre comment ...
[Modifier] J'aurais dû mentionner que je recherchais une solution qui ne nécessite pas d'interrogation.
[Modifier] Malédictions! Il semble que cela ne fonctionne pas sur un lecteur réseau mappé. Je suppose que Windows n'entend pas les mises à jour du fichier comme il le fait sur un disque local.
strace
deswrite
appels de surveillance pour celaRéponses:
Avez-vous déjà consulté la documentation disponible sur http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html ? Si vous n'en avez besoin que pour travailler sous Windows, le 2ème exemple semble être exactement ce que vous voulez (si vous échangez le chemin du répertoire avec celui du fichier que vous voulez regarder).
Sinon, l'interrogation sera probablement la seule option vraiment indépendante de la plateforme.
Remarque: je n'ai essayé aucune de ces solutions.
la source
Avez-vous essayé d'utiliser Watchdog ?
la source
easy_install
? Vérifier. License gratuite? Vérifiez . Résout le problème sur les grandes plateformes? Vérifiez . J'approuve cette réponse. Seule remarque: l' exemple sur leur page de projet ne fonctionne pas tout de suite. Utilisez plutôt celui sur leur github .Si l'interrogation vous convient, je regarderais simplement si la statistique du fichier "heure modifiée" change. Pour le lire:
(Notez également que la solution d'événement de modification native de Windows ne fonctionne pas dans toutes les circonstances, par exemple sur les lecteurs réseau.)
la source
if self._cached_stamp is not None
.Si vous voulez une solution multiplateforme, vérifiez QFileSystemWatcher . Voici un exemple de code (non aseptisé):
la source
watchdog
package est la bonne réponsePySide
pour cela plutôt quePyQt
pour une si petite utilisation.Cela ne devrait pas fonctionner sur Windows (peut-être avec cygwin?), Mais pour les utilisateurs d'Unix, vous devriez utiliser l'appel système "fcntl". Voici un exemple en Python. C'est surtout le même code si vous avez besoin de l'écrire en C (mêmes noms de fonction)
la source
Découvrez pyinotify .
inotify remplace dnotify (à partir d'une réponse antérieure) dans les nouveaux linux et permet une surveillance au niveau du fichier plutôt qu'au niveau du répertoire.
la source
Eh bien, après un peu de piratage du script de Tim Golden, j'ai ce qui suit qui semble assez bien fonctionner:
Cela pourrait probablement faire avec une charge plus de vérification des erreurs, mais pour simplement regarder un fichier journal et faire un traitement avant de le cracher à l'écran, cela fonctionne bien.
Merci à tous pour votre contribution - super trucs!
la source
Pour regarder un seul fichier avec interrogation et dépendances minimales, voici un exemple entièrement étoffé, basé sur la réponse de Deestan (ci-dessus):
la source
watch_file
et créer des_cached_stamp
listes, puis les parcourir en boucle for. Ne s'adapte pas vraiment bien à un grand nombre de fichierscall_func_on_change()
sera déclenché lors de la première exécution delook()
, mais sera ensuite_cached_stamp
mis à jour, il ne sera donc pas déclenché à nouveau tant que la valeur desos.stat(self.filename).st_mtime. _cached_stamp
modifications n'aura pas été modifiée ._cached_stamp
dans le constructeur si vous ne voulezcall_func_on_change()
pas être appelé lors de la première exécutionself.call_func_on_change(self) def custom_action(): watcher = Watcher(watch_file, custom_action())
Mais cela n'a pas fonctionné. L'action n'a été appelée que lors de la première itération: le fichier a été modifié, le fichier a été modifié. Le fichier a été modifié. Le fichier a été modifiéwatcher = Watcher(watch_file, custom_action)
.Vérifiez ma réponse à une question similaire . Vous pouvez essayer la même boucle en Python. Cette page propose:
Voir aussi la question tail () un fichier avec Python .
la source
La solution la plus simple pour moi est d'utiliser l'outil de surveillance watchmedo
Depuis https://pypi.python.org/pypi/watchdog, j'ai maintenant un processus qui recherche les fichiers sql dans un répertoire et les exécute si nécessaire.
la source
Eh bien, puisque vous utilisez Python, vous pouvez simplement ouvrir un fichier et continuer à en lire des lignes.
Si la ligne lue n'est pas vide , vous la traitez.
Il se peut que vous manquiez de continuer à appeler
readline
à l'EOF. Dans ce cas, il continuera à renvoyer une chaîne vide. Et lorsque quelque chose est ajouté au fichier journal, la lecture se poursuit à l'endroit où elle s'est arrêtée, selon vos besoins.Si vous recherchez une solution qui utilise des événements ou une bibliothèque particulière, veuillez le spécifier dans votre question. Sinon, je pense que cette solution est très bien.
la source
Voici une version simplifiée du code de Kender qui semble faire la même astuce et n'importe pas le fichier entier:
la source
Ceci est une autre modification du script de Tim Goldan qui s'exécute sur les types Unix et ajoute un simple observateur pour la modification de fichiers en utilisant un dict (file => time).
utilisation: quel que soit le nom.py path_to_dir_to_watch
la source
Comme vous pouvez le voir dans l'article de Tim Golden , pointé par Horst Gutmann , WIN32 est relativement complexe et surveille les répertoires, pas un seul fichier.
J'aimerais vous suggérer de regarder dans IronPython , qui est une implémentation de python .NET . Avec IronPython, vous pouvez utiliser toutes les fonctionnalités .NET - y compris
Qui gère des fichiers uniques avec une interface d' événement simple .
la source
Ceci est un exemple de vérification des modifications d'un fichier. Celui qui n'est peut-être pas la meilleure façon de le faire, mais c'est certainement un court chemin.
Outil pratique pour redémarrer l'application lorsque des modifications ont été apportées à la source. Je l'ai fait en jouant avec pygame afin que je puisse voir les effets se produire immédiatement après l'enregistrement du fichier.
Lorsqu'il est utilisé dans pygame, assurez-vous que le contenu de la boucle `` while '' est placé dans votre boucle de jeu, alias mise à jour ou autre. Sinon, votre application restera bloquée dans une boucle infinie et vous ne verrez pas la mise à jour de votre jeu.
Au cas où vous voudriez le code de redémarrage que j'ai trouvé sur le web. C'est ici. (Pas pertinent pour la question, bien que cela puisse être utile)
Amusez-vous à faire faire aux électrons ce que vous voulez qu'ils fassent.
la source
.st_mtime
place de.st_size
serait plus fiable et un moyen tout aussi court de le faire, bien que l'OP ait indiqué qu'il ne voulait pas le faire via un sondage.la source
Voici un exemple conçu pour regarder des fichiers d'entrée qui n'écrivent pas plus d'une ligne par seconde mais généralement beaucoup moins. Le but est d'ajouter la dernière ligne (écriture la plus récente) au fichier de sortie spécifié. J'ai copié ceci à partir d'un de mes projets et j'ai juste supprimé toutes les lignes non pertinentes. Vous devrez remplir ou modifier les symboles manquants.
Bien sûr, la classe QMainWindow englobante n'est pas strictement requise, c'est-à-dire. vous pouvez utiliser QFileSystemWatcher seul.
la source
Vous pouvez également utiliser une simple bibliothèque appelée repyt , voici un exemple:
la source
Semble que personne n'a posté fswatch . Il s'agit d'un observateur de système de fichiers multiplateforme. Installez-le, exécutez-le et suivez les invites.
Je l'ai utilisé avec des programmes python et golang et ça marche.
la source
solution @ 4Oh4 associée un changement en douceur pour une liste de fichiers à regarder;
la source
La solution la meilleure et la plus simple consiste à utiliser pygtail: https://pypi.python.org/pypi/pygtail
la source
Je ne connais aucune fonction spécifique à Windows. Vous pouvez essayer d'obtenir le hachage MD5 du fichier toutes les secondes / minutes / heures (selon la vitesse à laquelle vous en avez besoin) et le comparer au dernier hachage. Lorsqu'il diffère, vous savez que le fichier a été modifié et vous lisez les lignes les plus récentes.
la source
J'essaierais quelque chose comme ça.
La boucle vérifie s'il y a une ou plusieurs nouvelles lignes depuis la dernière lecture du fichier - si c'est le cas, elle est lue et transmise à la
functionThatAnalisesTheLine
fonction. Sinon, le script attend 1 seconde et recommence le processus.la source