Wie kann ich sehen, eine Datei für die änderungen?
Habe ich eine log-Datei geschrieben wird von einem anderen Prozess, die ich sehen will für änderungen. Jedes mal, wenn eine änderung Auftritt, würd ich gern Lesen die neuen Daten zu tun, einige Bearbeitung auf.
Was ist der beste Weg, dies zu tun? Ich hatte gehofft, es würde eine Art Haken aus der PyWin32-Bibliothek. Ich habe festgestellt, das win32file.FindNextChangeNotification
Funktion haben aber keine Ahnung, wie zu Fragen, es zu sehen, eine bestimmte Datei.
Wenn jemand so etwas getan, wäre ich wirklich dankbar zu hören, wie...
[Bearbeiten] ich sollte erwähnt haben, dass ich nach einer Lösung, die nicht erfordert polling.
[Bearbeiten] Flüche! Es scheint, das funktioniert nicht über ein zugeordnetes Netzlaufwerk. Ich vermute, dass windows nicht 'hören' alle Aktualisierungen an der Datei, wie es funktioniert auf einem lokalen Datenträger.
strace
überwachung write
fordert, dass diese@simao Antwort verwendet python-watchdog. Python-Watchdog hat eine große Dokumentation --> hier ist ein link zu den ["QuickStart" - Dokumentation, die enthält eine minimale code-Beispiel, dass Uhren das aktuelle Arbeitsverzeichnis.
InformationsquelleAutor Jon Cage | 2008-10-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie sah schon bei der Dokumentation auf http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html? Wenn Sie nur brauchen, es unter Windows funktioniert das 2. Beispiel zu sein scheint, genau das, was Sie wollen (wenn Sie den Austausch der Pfad zu dem Verzeichnis mit der Datei, die Sie wollen, zu sehen).
Ansonsten polling wird wahrscheinlich der einzige, der wirklich Plattform-unabhängige option.
Hinweis: ich habe nicht versucht, eine dieser Lösungen.
Gibt es eine benchmark, wenn dieser Prozess langsamer ist, dann Umsetzung in einer nativen Sprache wie c++ ?
Es ist besser, legen Sie die relevanten Inhalte aus zitierten Quellen, wie Sie können, veraltet.
(1.) am Ende dieser Antwort ist eine starke Haftungsausschluss... "ich habe nicht versucht, irgendwelche Lösungen". (2.) diese Antwort ist mehr oder weniger ein "nur Links" Antwort (3.) die Antwort erwähnt, "polling", aber nicht alles hinzufügen, was hilfreich ist, nach, dass..., wo als @Deestan Antwort bietet einige gute Infos auf Abruf
InformationsquelleAutor Horst Gutmann
Haben Sie versucht, mit Watchdog?
easy_install
? Check. Freie Lizenz? Check. Löst das problem auf den großen Plattformen? Check. Ich unterstütze diese Antwort. Nur Hinweis: die Beispiel auf Ihrer Projekt-Seite funktioniert nicht out of the box. die auf Ihrer github statt.Wir verwenden watchdog. Wir können wechseln, um QFileSystemWatcher. Nur eine faire Warnung - watchdog ist gut, aber weit entfernt von perfekt auf allen Plattformen (zu diesem Zeitpunkt). Jedes OS hat seine Eigenheiten. So, es sei denn, Sie gewidmet sind, machen es perfekt, Sie wird ziehen Sie Ihre Haare aus. Wenn Sie gerade auf der Suche, um Uhr 10 Dateien oder so, ich würde Umfrage. OS disk-caching ist sehr ausgereift und Watchdog beinhaltet polling-APIs sowieso. Es ist vor allem für das ansehen von großen Ordnerstrukturen IMHO.
Meine eine Beschwerde mit watchdog ist, dass es hat viele Abhängigkeiten. Weniger als PyQt, natürlich, aber es funktioniert nicht und fühle mich wie die minimale, best-practice-tut-man-job-und-tut-es-Recht-Lösung.
Ist @denfromufa richtig hier? Tut watchdog wirklich lock-Dateien, so können Sie nicht bearbeitet werden, parallel zu der watchdog gerade Sie? Ich kann kaum glauben, dass es wäre völlig nutzlos.
Ich habe gerade überprüft dieses Beispiel (siehe link unten) und es funktioniert! nicht sicher, was Los war, bevor, aber diese Antwort stellt keine Beispiel. stackoverflow.com/a/18599427/2230844
InformationsquelleAutor simao
Wenn polling ist gut genug für dich ist, würde ich nur sehen, wenn das "änderungsdatum" der Datei stat änderungen. Es Lesen:
(Beachten Sie auch, dass die nativen Windows-change-Ereignis-Lösung funktioniert nicht in allen Lebenslagen, z.B. auf Netzwerk-Laufwerke.)
Hier ist, wie können Sie dies tun auf einem Intervall ` import sys import time pub = Affe() while True: try: Zeit.sleep(1) pub.watch() except KeyboardInterrupt: print ("\nDone') break except: print(f'Unhandled Fehler: {sys.exc_info()[0]}') `
Vollständig ausgearbeiteten Beispiel-code: stackoverflow.com/a/49007649/5859283
funktioniert gut, gute Idee,
InformationsquelleAutor Deestan
Wenn Sie möchten, eine Multiplattform-Lösung, dann überprüfen Sie QFileSystemWatcher.
Hier ein Beispiel-code (nicht bereinigt):
Ich mag diese Lösung. Ich wollte darauf hinweisen, dass Sie brauchen, ein QApplication-Instanz für ihn zu arbeiten, fügte ich "app = QtGui.QApplication(sys.argv)" rechts unter der Einfuhren und dann auf "app.exec_()" nach dem signal-verbindungen.
Einfach nur testen diese auf einer Linux-box, die ich bin, zu sehen, dass die directory_changed Methode aufgerufen wird, aber nicht file_changed.
wenn Sie nicht wie die pyQt-Abhängigkeit, die
watchdog
- Paket ist die richtige Antwortwarum nicht
PySide
für Sie, dass anstelle vonPyQt
für solch einen kleinen nutzen.InformationsquelleAutor hipersayan_x
Sollte es unter windows nicht funktionieren (vielleicht mit cygwin ?), aber für unix-Benutzer sind, sollten Sie die "fcntl" system call. Hier ist ein Beispiel in Python. Es ist meist der gleiche code, wenn Sie brauchen, um es zu schreiben in C (gleiche Funktion Namen)
Funktioniert wie ein Charme mit Linux-kernel 2.6.31 auf ein ext4-Dateisystem (auf Ubuntu 10.04), allerdings nur für Verzeichnisse - es wirft eine IOError "kein Verzeichnis", wenn ich es nur mit einer Datei.
SUPER!!! Das gleiche gilt für mich, funktioniert für Verzeichnis und beobachten Sie Dateien in dieses Verzeichnis. Aber es funktioniert nicht für geänderte Dateien in Unterverzeichnissen, so wie es aussieht benötigen Sie zu Fuß throught Unterverzeichnisse und sehen Sie alle von Ihnen. (oder gibt es einen besseren Weg, dies zu tun?)
InformationsquelleAutor Maxime
Check-out pyinotify.
inotify ersetzt dnotify (aus einer früheren Antwort) in neueren Linux-Versionen und ermöglicht Datei-Ebene statt auf Verzeichnis-Ebene-überwachung.
Nicht einen Dämpfer auf diese Antwort, aber nach der Lektüre dieses Artikels, ich würde sagen, dass es vielleicht nicht so glamourös eine Lösung, die so dachte. serpentine.com/blog/2008/01/04/why-you-should-not-use-pyinotify
pyinotify hat eine Menge Nachteile ab sehr unpythonic code-Basis, um den Speicherverbrauch. Besser zu sehen für andere Optionen..
InformationsquelleAutor Michael Palmer
Gut nach ein bisschen hacken von Tim Golden-Skript habe ich die folgende, die scheint ganz gut zu funktionieren:
Könnte es wahrscheinlich nicht mit einer Belastung mehr Fehler überprüfen, aber für einfach nur beobachten eine log-Datei und einige Verarbeitung auf, bevor Sie spucken es aus, um den Bildschirm, das funktioniert gut.
Danke an alle für Ihren input - great stuff!
InformationsquelleAutor
Einfachste Lösung für mich ist mit watchdog-tool watchmedo
Vom https://pypi.python.org/pypi/watchdog ich habe jetzt ein Prozess, der sieht die sql-Dateien in einem Verzeichnis und führt Sie aus, wenn nötig.
InformationsquelleAutor redestructa
Überprüfen meine Antwort zu einem ähnliche Frage. Sie könnten versuchen, die gleiche Schleife in Python. Auf dieser Seite schlägt vor:
Siehe auch die Frage tail() eine Datei mit Python.
Ich habe eine modifizierte version des Codes. Sie kann integrieren es in Ihre Antwort, wenn es für Sie funktioniert.
InformationsquelleAutor Bruno De Fraine
Gut, da man sich mit Python, können Sie nur eine Datei öffnen und Lesen Zeilen von ihm.
Wenn Sie die Zeile Lesen, ist nicht leer, Sie zu verarbeiten.
Möglicherweise fehlt, dass es ok ist, zu halten, ruft
readline
auf die EOF. Es wird nur immer wieder eine leere Zeichenfolge in diesem Fall. Und wenn etwas angehängt wird, um die log-Datei, das Lesen wird weiterhin von wo es aufgehört, als Sie brauchen.Wenn Sie auf der Suche nach einer Lösung, die mithilfe von Ereignissen, oder eine bestimmte Bibliothek bitte geben Sie Ihre Frage ein. Ansonsten finde ich diese Lösung Prima.
InformationsquelleAutor seuvitor
Hier ist eine vereinfachte version des kenders code, der angezeigt wird, das gleiche zu tun, trick und nicht den import der gesamten Datei:
InformationsquelleAutor AlaXul
Dies ist eine weitere Modifikation von Tim Goldan - Skript, das läuft auf linux und bringt eine simple watcher für Datei-änderung durch die Verwendung eines dict (Datei=>Zeit).
Verwendung: whateverName.py path_to_dir_to_watch
InformationsquelleAutor ronedg
Zum betrachten eine einzige Datei mit polling und minimale Abhängigkeiten, hier ist einer voll ausgestatteten-out-Beispiel, basierend auf der Antwort von Deestan (oben):
Sie könnten
watch_file
und_cached_stamp
in Listen und iterieren über Sie in einer for-Schleife. Nicht wirklich gut skalieren, um große Anzahl von Dateien, obwohlInformationsquelleAutor 4Oh4
Wie Sie sehen können, in Tim Golden Artikel, zeigte Horst Gutmann, WIN32 ist relativ Komplex und Uhren-Verzeichnisse, nicht eine einzelne Datei.
Möchte ich schlage vor, Sie schauen in IronPython, das ist ein .NET python-Implementierung.
Mit IronPython können Sie alle .NET - Funktionalität, einschließlich
Behandelt einzelne Dateien mit einem einfachen Veranstaltung - Schnittstelle.
InformationsquelleAutor gimel
Dies ist ein Beispiel für die überprüfung einer Datei auf änderungen. Einer, der möglicherweise nicht der beste Weg, es zu tun, aber sicher ist es nur ein kurzer Weg.
Handliches Werkzeug für einen Neustart der Anwendung, wenn änderungen vorgenommen wurden, um die Quelle. Ich habe diese beim spielen mit pygame, damit ich sehen kann Effekte sofort nach dem die Datei zu speichern.
Beim Einsatz in pygame stellen Sie sicher, dass das Zeug in der 'while' - Schleife ist in Ihrem Spiel-Schleife aka update oder was auch immer. Ihr Antrag wird sonst stecken in einer Endlosschleife und Sie werden nicht sehen, Ihr Spiel zu aktualisieren.
In den Fall, Sie wollten den restart-code, die ich im Internet gefunden habe. Hier ist es. (Nicht relevant für die Frage, aber es könnte nützlich)
Haben Spaß dabei Elektronen tun, was Sie von Ihnen wollen.
.st_mtime
statt.st_size
würde zuverlässiger sein und ein ebenso kurzer Weg, dies zu tun, obwohl die OP hat angegeben, dass er wollte nicht, es zu tun via polling.InformationsquelleAutor Bassim Huis
InformationsquelleAutor imp
Hier ist ein Beispiel ausgerichtet ist, die beobachtete input-Dateien, die nicht mehr schreiben als eine Zeile pro Sekunde, aber in der Regel viel weniger. Das Ziel ist die Letzte Zeile angefügt werden (die meisten aktuellen schreiben) an die angegebene Ausgabedatei. Habe ich kopiert aus einem meiner Projekte und nur gelöscht, alle nicht relevanten Zeilen. Sie haben zu füllen, oder ändern Sie die Symbole fehlen.
Natürlich die allumfassende QMainWindow Klasse ist nicht unbedingt erforderlich, dh. Sie können QFileSystemWatcher allein.
InformationsquelleAutor
Die beste und einfachste Lösung ist die Verwendung pygtail:
https://pypi.python.org/pypi/pygtail
InformationsquelleAutor george
Können Sie auch eine einfache Bibliothek namens repyt, hier ist ein Beispiel:
InformationsquelleAutor Rafal Enden
Scheint, dass niemand gepostet hat fswatch. Es ist ein cross-Plattform-file-system-watcher. Installieren Sie es einfach, führen Sie es und Folgen Sie den Anweisungen.
Ich habe es mit python und golang Programme und es funktioniert einfach.
InformationsquelleAutor Gus
Kenne ich keine Windows-spezifische Funktion. Sie könnten versuchen, immer den MD5-hash der Datei jede Sekunde/minute/Stunde (hängt davon ab, wie schnell Sie es brauchen) und vergleichen Sie es mit dem letzten hash. Wenn es sich unterscheidet, Sie wissen, die Datei wurde verändert und Lesen Sie die neuesten Linien.
InformationsquelleAutor daddz
Ich würde versuchen, so etwas wie dieses.
Die Schleife prüft, ob eine neue Zeile(s) seit dem letzten mal die Datei gelesen wurde, wenn es ist, es ist ausgelesen und an die
functionThatAnalisesTheLine
Funktion. Wenn nicht, Skript wartet 1 Sekunde und wiederholt den Prozess.Wirklich? Öffnen Sie die Datei für die änderungen?
InformationsquelleAutor kender