Datei überwachen und bei Änderung etwas tun

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Hi,
ich möchte ein kleines Tool programmieren das als Tray Icon im Hintergrund eine (oder mehrere) Datei(en) überwacht ob sie geändert wurden. Sobald eine Änderung erkannt wird soll eine Aktion ausgeführt werden. Wie kann ich sowas machen?

Gruß
Burli
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Unter Linux geht das mit inotify. Unter Windows gibt es scheinbar mehrere Lösungen, die aber nicht besonders zuverlässig zu sein scheinen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Hi Leonidas,
inotify klingt kompliziert und nach Kanonen und Spatzen. Außerdem wäre es nicht schlecht wenn es unter Linux und Windows ohne große Änderung funktioniert.

Ich denke mir bleibt nichts anderes übrig als im Sekundentakt Datum/Uhrzeit zu prüfen. Oder gibt es noch eine elegantere Lösung in Python?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

burli hat geschrieben:Ich denke mir bleibt nichts anderes übrig als im Sekundentakt Datum/Uhrzeit zu prüfen. Oder gibt es noch eine elegantere Lösung in Python?
Polling ist übel, weil du da Events verpassen kannst, die weniger als eine Sekunde dauern und außerdem verbraucht es unnötig Ressourcen, weil es eben oft pollt wenn sich nichts geändert hat. Für Python gibts python-inotify.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

hier findest du ein Tool, das alle 5 Sekunden deine Dateien überprüft und dann nosetest ausführt. Vielleicht hilft dir das weiter.
Wie Leonidas aber schon erwähnt, ist es nicht die schönste Lösung für das Problem.

nen Tray Icon kannst du mit gtk.StatusIcon relativ einfach machen. Ne Anwendung, die das verwendet gibts z.B. hier


MfG EnTeQuAk
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Ich wollte eigentlich einen eigenen Task dafür verwenden den ich eine Sekunde lang schlafen lasse. Dann prüft er kurz Datum/Uhrzeit der Datei oder macht vielleicht einen md5 Hash und geht wieder schlafen. Dürfte eigentlich weder viel Performance kosten noch irgendwelche Events verschlucken.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

burli hat geschrieben:Dürfte eigentlich weder viel Performance kosten noch irgendwelche Events verschlucken.
Doch, es kostet IO, weil du ja pollst wo möglicherweise gar nichts passiert ist. Ein Schreibvorgang + ein Löschvorgang können durchaus auch mal kürzer als eine Sekunde dauern.

Code: Alles auswählen

$ time touch test && rm test

real	0m0.003s
user	0m0.001s
sys	0m0.002s
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Natürlich kostet es Zeit. Aber diese spezielle Anwendung ist für die Entwicklung gedacht. Dh im Normalfall läuft sie nicht permanent. Außerdem soll sie nicht 100 Dateien von je 5MB Größe überwachen.

Ich werde versuchen die Überwachung transparent zu machen so das man, sollte es wirklich unangenehme Ausmaße annehmen, das ganze noch auf pyinotify bzw das entsprechende Windows Equivalent umstellen kann ohne von vorne anfangen zu müssen


Und wieso ein Schreibvorgang + Löschvorgang? Die Applikation schreibt und löscht nichts. Die liest nur den Status der Datei (Datum/Uhrzeit/Größe) und vergleicht das mit dem vorhergehenden. Schreiben/löschen ist in dem Fall eher kontraproduktiv
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

burli hat geschrieben:Und wieso ein Schreibvorgang + Löschvorgang?
Weil ich zeigen wollte, dass du mit einer Sekunde Intervall durchaus bestimmte Dinge übersehen kannst. Mit einer Sekunde Intervall hat eine Datei die erstellt und gelöscht worden ist bei dir nie existiert, aber sie war dennoch da nur hat dein Programm es nicht bemerkt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Ach jetzt versteh ich dich. Nein, das ist nicht der Fall. Die Datei existiert. Und bevor noch mehr um den Brei geredet wird:

Es soll ein kleines Tool werden das eine *.hex Datei überwacht, die von einem C-Compiler erzeugt wird. Wenn man neu compiliert soll das Programm die geänderte Hex Datei automatisch in einen Mikrocontroller laden oder, wenn man das nicht will, das nur zb für 10 Sekunden ein Download Button erscheint der wieder verschwindet wenn man nichts macht.

Später könnte ich mir vorstellen das man auf diese Weise die kompletten Sourcen (also *.c und *.h Files) überwacht und bei einer Änderung automatisch compiliert. In dem Fall wäre inotify klar im Vorteil. Aber so weit bin ich noch nicht

Im Moment geht es wirklich nur um eine einzelne Datei die nur geändert, aber nicht gelöscht wird.
BlackJack

Wie stellst Du sicher, dass "Datei verändert" bedeutet, dass die Veränderung komplett abgeschlossen ist? Also zum Beispiel: Compiler erzeugt gerade die Hexdatei, Dein Programm merkt dass sich die Datei ändert und sendet fröhlich drauf los, kommt aber am "Ende" der Datei an, bevor der Compiler alles geschrieben hat!?
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Ich gehe davon aus das das Betriebssystem das Änderungsdatum als letztes schreibt. Du hast schon Recht, sicher ist das nicht. Aber ich muss ja irgendwie mal anfangen

Wie gesagt, ich will den Teil möglichst so transparent machen das es egal ist ob ich Polle oder mit inotify arbeite
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Es soll ein kleines Tool werden das eine *.hex Datei überwacht, die von einem C-Compiler erzeugt wird. Wenn man neu compiliert soll das Programm die geänderte Hex Datei automatisch in einen Mikrocontroller laden
Dann wuerde ich das eher andersrum machen: Schreib dir ein Script/Makefile/..., welches comiliert und danach, wenn das compilieren erfolgreich durchlief, die Binaries irgendwo hinschiebt. Koennte ja auch sein, dass der Compiler mit ner Fehlermeldung abbricht.

Und sourcen bei Aenderungen automatisch compilieren halte ich auch fuer fragwuerdig -- ich speichere z.B. haeufig zwischendurch, ohne dass das schon gleich lauffaehig/compilierbar ist.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Rebecca hat geschrieben: Dann wuerde ich das eher andersrum machen: Schreib dir ein Script/Makefile/..., welches comiliert und danach, wenn das compilieren erfolgreich durchlief, die Binaries irgendwo hinschiebt. Koennte ja auch sein, dass der Compiler mit ner Fehlermeldung abbricht.
Das stimmt schon, aber in dem Fall würde die Hex Datei nicht geändert
Rebecca hat geschrieben: Und sourcen bei Aenderungen automatisch compilieren halte ich auch fuer fragwuerdig -- ich speichere z.B. haeufig zwischendurch, ohne dass das schon gleich lauffaehig/compilierbar ist.
Das ist auch nur eine Überlegung weil es von einem Bekannten angeregt wurde.

Das ganze soll erstmal für mich ein kleines Helper Tool werden das sich in der Taskleiste einnistet und die wichtigsten Funktionen, die man beim Arbeiten mit Mikrocontrollern braucht, zur Verfügung stellt, hauptsächlich um unabhängig von irgendwelchen Editoren, Compilern oder IDEs arbeiten zu können. Eine Funktion ist eben das Hochladen eines compilierten Files in den Controller.

Wenn man eine Datei compiliert und keine Fehler auftraten will man es zum Testen meistens sowieso gleich in den Controller laden, also kann das ohne extra Handgriff auch gleich automatisch gehen. Und damit das auch unabhängig vom Compiler oder Editor funktioniert mach ich eben ein extra Tool. Würde man nur mit dem avr-gcc arbeiten könnte man das auch irgendwie im Makefile oder so verwurschteln
BlackJack

Darauf, dass die Metainformationen nur am Ende aktualisiert werden, würde ich mich nicht verlassen. Eine Aktualisierung pro Aktion die mindestens einen vollen Block umfasst, würde mich jedenfalls nicht überraschen.
Antworten