ubuntuusers.de

Python: Änderung im sysfs überwachen

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Maui_Muc

Anmeldungsdatum:
31. Dezember 2006

Beiträge: 441

Hallo,

ich wollte mal fragen wie ich mit Python am besten eine Datei im sysfs überwache. Also wenn sich der Inhalt der Datei /sys/devices/platform/smapi/ac_connected ändert soll etwas passieren.

Bisher erledige ich diese Aufgabe eher dilettantisch:

1
2
3
4
5
6
7
... 
while 1: 
    f = open( path+'/ac_connected')
    ac_connected = bool( int( f.readline() ) ) # '0' oder '1' -> False oder True
    f.close()
    ...
    sleep( 120 )  

Ich wäre euch sehr Dankbar für Verbesserungsvorschläge.

Viele Grüße

Stefan

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Such mal nach pyinotify. Das dürfte deinen Anforderungen entsprechen.

Falls du keine Drittbibliothek nutzen willst, dann könnte man auch das Änderungsdatum der Datei mittels os.path.getmtime() überwachen.

Im Übrigen hätte bei deiner Methode ein if f.readline(): ausgereicht¹. Zeichenketten mit Inhalt sind in Python immer wahr. Zudem fragt sich, ob du tatsächlich immer die erste Zeile auslesen willst und in Wirklichkeit gucken willst, ob eine Zeile dazu gekommen ist. Mal davon ab, dass man hier eher die Dateigröße prüfen würde, müsstest du dir andernfalls die Dateiposition merken (f.tell()) und dort beim erneuten Öffnen hinspringen (f.seek()). Aber wie gesagt: Vergleiche lieber die mtime. 😉

¹ Kann aber auch sein, dass ich dein Vorgehen missverstanden habe...

Maui_Muc

(Themenstarter)

Anmeldungsdatum:
31. Dezember 2006

Beiträge: 441

Wie man pyinotify nutzt erschließt sich mir nicht auf den ersten Blick. Ich habe versucht das Tutorial zu verstehen aber das überschreitet meinen Fähigkeiten. Klassen und Objekte sind noch immer ein rotes Tuch für mich, leider.

Falls du keine Drittbibliothek nutzen willst, dann könnte man auch das Änderungsdatum der Datei mittels os.path.getmtime() überwachen.

Vielen Dank für diesen Tipp, das klingt viel versprechend. Das löst aber nicht mein Problem mit dem Event-Handling. Vom Prinzip her will ich mein Programm nur dann laufen lassen wenn etwas passiert. Also nur wenn sich die Datei ändert soll das Programm was tun. Mich stört die Endlosschleife.

Im Übrigen hätte bei deiner Methode ein if f.readline(): ausgereicht¹. Zeichenketten mit Inhalt sind in Python immer wahr. Zudem fragt sich, ob du tatsächlich immer die erste Zeile auslesen willst und in Wirklichkeit gucken willst, ob eine Zeile dazu gekommen ist. Mal davon ab, dass man hier eher die Dateigröße prüfen würde, müsstest du dir andernfalls die Dateiposition merken (f.tell()) und dort beim erneuten Öffnen hinspringen (f.seek()). Aber wie gesagt: Vergleiche lieber die mtime. 😉

Die Datei besteht aus nur eine Zeile und einem Zeichen, entweder '0' oder '1'. Diese beiden Chars wandle ich in 'True' oder 'False' um. Wobei der Wert an sich nicht wirklich interessant ist. Lediglich die Änderung True->False oder eben False->True.

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Na, du legst die "Watch-Maske" für Veränderungen auf die Datei und bindest an dieses Event eine Callback-Funktion, die dann eben das tut, was bei einer Änderung gemacht werden soll.

Ich würde dir anstatt des Tutorials eher die Beispiele empfehlen, anhand derer man die Bibliothek IMHO besser versteht.

Antworten |