Ich habe eine Protokolldatei, die von einem anderen Prozess geschrieben wird und auf Änderungen achten möchte. Jedes Mal, wenn eine Änderung auftritt, möchte ich die neuen Daten einlesen, um sie zu verarbeiten.
Was ist der beste Weg, dies zu tun? Ich hatte gehofft, dass es eine Art Hook aus der PyWin32-Bibliothek geben würde. Ich habe die win32file.FindNextChangeNotification
Funktion gefunden, habe aber keine Ahnung, wie ich sie bitten soll, eine bestimmte Datei anzusehen.
Wenn jemand so etwas getan hat, wäre ich wirklich dankbar zu hören, wie ...
[Bearbeiten] Ich hätte erwähnen sollen, dass ich nach einer Lösung gesucht habe, die keine Abfrage erfordert.
[Bearbeiten] Flüche! Es scheint, dass dies über ein zugeordnetes Netzlaufwerk nicht funktioniert. Ich vermute, Windows "hört" keine Aktualisierungen der Datei wie auf einer lokalen Festplatte.
strace
Überwachungwrite
dieser Anrufe fürAntworten:
Haben Sie sich bereits die Dokumentation unter http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html angesehen ? Wenn Sie es nur benötigen, um unter Windows zu funktionieren, scheint das zweite Beispiel genau das zu sein, was Sie möchten (wenn Sie den Pfad des Verzeichnisses mit dem der Datei austauschen, die Sie überwachen möchten).
Andernfalls ist die Abfrage wahrscheinlich die einzige wirklich plattformunabhängige Option.
Hinweis: Ich habe keine dieser Lösungen ausprobiert.
quelle
Haben Sie versucht, Watchdog zu verwenden ?
quelle
easy_install
? Prüfen. Freie Lizenz? Überprüfen Sie . Löst das Problem auf den großen Plattformen? Überprüfen Sie . Ich unterstütze diese Antwort. Einziger Hinweis: Das Beispiel auf der Projektseite funktioniert nicht sofort. Verwenden Sie stattdessen die auf ihrem Github .Wenn die Abfrage für Sie gut genug ist, würde ich nur beobachten, ob sich der Status der Datei "Geänderte Zeit" ändert. Um es zu lesen:
(Beachten Sie auch, dass die native Windows-Änderungsereignislösung nicht unter allen Umständen funktioniert, z. B. auf Netzwerklaufwerken.)
quelle
if self._cached_stamp is not None
.Wenn Sie eine plattformübergreifende Lösung wünschen, überprüfen Sie QFileSystemWatcher . Hier ein Beispielcode (nicht bereinigt):
quelle
watchdog
Paket die richtige AntwortPySide
dafür anstattPyQt
für so einen kleinen Gebrauch verwenden.Es sollte nicht unter Windows funktionieren (vielleicht mit Cygwin?), Aber für Unix-Benutzer sollten Sie den Systemaufruf "fcntl" verwenden. Hier ist ein Beispiel in Python. Es ist meistens der gleiche Code, wenn Sie ihn in C schreiben müssen (gleiche Funktionsnamen)
quelle
Schauen Sie sich pyinotify an .
inotify ersetzt dnotify (aus einer früheren Antwort) in neueren Linux-Versionen und ermöglicht die Überwachung auf Dateiebene anstelle der Überwachung auf Verzeichnisebene.
quelle
Nun, nach einigem Hacken von Tim Goldens Drehbuch habe ich Folgendes, was ziemlich gut zu funktionieren scheint:
Es könnte wahrscheinlich mit einer weiteren Fehlerprüfung verbunden sein, aber wenn Sie einfach eine Protokolldatei ansehen und sie bearbeiten, bevor Sie sie auf den Bildschirm ausspucken, funktioniert dies gut.
Vielen Dank an alle für Ihre Beiträge - tolle Sachen!
quelle
Um eine einzelne Datei mit Abfragen und minimalen Abhängigkeiten anzusehen , finden Sie hier ein ausführliches Beispiel, das auf der Antwort von Deestan (oben) basiert :
quelle
watch_file
und_cached_stamp
in Listen und Iterierte über sie in einer for - Schleife. Skaliert nicht wirklich gut auf eine große Anzahl von Dateiencall_func_on_change()
wird beim ersten Durchlauf von ausgelöstlook()
, wird dann_cached_stamp
aber aktualisiert und wird erst wieder ausgelöst, wenn sich der Wert vonos.stat(self.filename).st_mtime. _cached_stamp
ändert._cached_stamp
im Konstruktor festlegen, wenn Siecall_func_on_change()
beim ersten Lauf nicht aufgerufen werden möchtenself.call_func_on_change(self) def custom_action(): watcher = Watcher(watch_file, custom_action())
Aber das hat nicht funktioniert. Aktion wurde nur während der ersten Iteration aufgerufen: Datei geändert ja, geändert Datei geändert Datei geändert Datei geändert Es begann zu funktionieren, als ich * args behielt und es aufrief:watcher = Watcher(watch_file, custom_action)
Ich habe Mühe, mich zu fragen, warum?Überprüfen Sie meine Antwort auf eine ähnliche Frage . Sie können dieselbe Schleife in Python ausprobieren. Diese Seite schlägt vor:
Siehe auch die Frage tail () einer Datei mit Python .
quelle
Die einfachste Lösung für mich ist die Verwendung des Watchdog-Tools watchmedo
Unter https://pypi.python.org/pypi/watchdog habe ich jetzt einen Prozess, der die SQL-Dateien in einem Verzeichnis sucht und sie bei Bedarf ausführt.
quelle
Nun, da Sie Python verwenden, können Sie einfach eine Datei öffnen und weiterhin Zeilen daraus lesen.
Wenn die gelesene Zeile nicht leer ist , verarbeiten Sie sie.
Möglicherweise fehlt Ihnen, dass es in Ordnung ist, weiterhin
readline
beim EOF anzurufen. In diesem Fall wird nur eine leere Zeichenfolge zurückgegeben. Und wenn etwas an die Protokolldatei angehängt wird, wird der Lesevorgang nach Bedarf dort fortgesetzt, wo er gestoppt wurde.Wenn Sie nach einer Lösung suchen, die Ereignisse oder eine bestimmte Bibliothek verwendet, geben Sie dies bitte in Ihrer Frage an. Ansonsten denke ich, dass diese Lösung in Ordnung ist.
quelle
Hier ist eine vereinfachte Version von Kenders Code, die anscheinend denselben Trick ausführt und nicht die gesamte Datei importiert:
quelle
Dies ist eine weitere Modifikation von Tim Goldans Skript, das unter Unix-Typen ausgeführt wird und einen einfachen Watcher für die Dateimodifikation mithilfe eines Diktats (file => time) hinzufügt.
Verwendung: WhateverName.py path_to_dir_to_watch
quelle
Wie Sie in Tim Goldens Artikel sehen können , auf den Horst Gutmann hingewiesen hat, ist WIN32 relativ komplex und überwacht Verzeichnisse, nicht eine einzige Datei.
Ich möchte vorschlagen, dass Sie sich mit IronPython befassen , einer .NET- Python-Implementierung. Mit IronPython können Sie alle .NET- Funktionen nutzen - auch
Welches behandelt einzelne Dateien mit einer einfachen Ereignisschnittstelle .
quelle
Dies ist ein Beispiel für das Überprüfen einer Datei auf Änderungen. Eine, die vielleicht nicht der beste Weg ist, aber es ist sicher ein kurzer Weg.
Praktisches Tool zum Neustarten der Anwendung, wenn Änderungen an der Quelle vorgenommen wurden. Ich habe dies beim Spielen mit Pygame gemacht, damit ich sofort nach dem Speichern der Datei Effekte sehen kann.
Wenn Sie in Pygame verwendet werden, stellen Sie sicher, dass sich das Material in der 'while'-Schleife in Ihrer Spieleschleife befindet, auch bekannt als Update oder was auch immer. Andernfalls bleibt Ihre Anwendung in einer Endlosschleife stecken und Sie werden nicht sehen, wie Ihr Spiel aktualisiert wird.
Für den Fall, dass Sie den Neustartcode wollten, den ich im Web gefunden habe. Hier ist es. (Nicht relevant für die Frage, obwohl es nützlich sein könnte)
Viel Spaß damit, dass Elektronen das tun, was Sie wollen.
quelle
.st_mtime
anstelle von.st_size
zuverlässiger und eine ebenso kurze Möglichkeit, dies zu tun, obwohl das OP angegeben hat, dass er dies nicht über Umfragen tun wollte.quelle
Hier ist ein Beispiel, das darauf ausgerichtet ist, Eingabedateien anzusehen, die nicht mehr als eine Zeile pro Sekunde, aber normalerweise viel weniger schreiben. Ziel ist es, die letzte Zeile (letzter Schreibvorgang) an die angegebene Ausgabedatei anzuhängen. Ich habe dies aus einem meiner Projekte kopiert und gerade alle irrelevanten Zeilen gelöscht. Sie müssen die fehlenden Symbole ausfüllen oder ändern.
Natürlich ist die umfassende QMainWindow-Klasse nicht unbedingt erforderlich, d. H. Sie können QFileSystemWatcher allein verwenden.
quelle
Sie können auch eine einfache Bibliothek namens repyt verwenden . Hier ein Beispiel:
quelle
Scheint, dass niemand fswatch gepostet hat . Es ist ein plattformübergreifender Dateisystem-Watcher. Installieren Sie es einfach, führen Sie es aus und befolgen Sie die Anweisungen.
Ich habe es mit Python- und Golang-Programmen verwendet und es funktioniert einfach.
quelle
verwandte @ 4Oh4-Lösung eine reibungslose Änderung für eine Liste der zu beobachtenden Dateien;
quelle
Die beste und einfachste Lösung ist die Verwendung von Pygtail: https://pypi.python.org/pypi/pygtail
quelle
Ich kenne keine Windows-spezifische Funktion. Sie können versuchen, den MD5-Hash der Datei jede Sekunde / Minute / Stunde abzurufen (abhängig davon, wie schnell Sie ihn benötigen) und ihn mit dem letzten Hash zu vergleichen. Wenn es anders ist, wissen Sie, dass die Datei geändert wurde und Sie lesen die neuesten Zeilen aus.
quelle
Ich würde so etwas versuchen.
Die Schleife prüft, ob seit dem letzten Lesen der Datei eine oder mehrere neue Zeilen vorhanden sind. Wenn dies der Fall ist, wird diese gelesen und an die
functionThatAnalisesTheLine
Funktion übergeben. Wenn nicht, wartet das Skript 1 Sekunde und wiederholt den Vorgang.quelle