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
Datei überwachen und bei Änderung etwas tun
-
- 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
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?
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?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.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?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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
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
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.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.burli hat geschrieben:Dürfte eigentlich weder viel Performance kosten noch irgendwelche Events verschlucken.
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
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
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
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.burli hat geschrieben:Und wieso ein Schreibvorgang + Löschvorgang?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
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.
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!?
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
Wie gesagt, ich will den Teil möglichst so transparent machen das es egal ist ob ich Polle oder mit inotify arbeite
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
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.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
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
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Das stimmt schon, aber in dem Fall würde die Hex Datei nicht geändertRebecca 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 ist auch nur eine Überlegung weil es von einem Bekannten angeregt wurde.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 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
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.