2016-04-23 11 views
0

Ich habe erfolgreich die Python-Bindungen zu io_add_watch in meinem dbus Hauptschleife verwendet, um auf Änderungen in einer bekannten einzelnen Datei zu reagieren. Aber ich habe jetzt einen Fall, in dem ich einen dbus-Haupt-Loop betreibe, und ich muss arbeiten, wenn sich ein Verzeichnis ändert.Python-dbus-Methode zum Ansehen einer Verzeichnisänderung?

Ich habe mit dem Befehlszeilentool inotifywait -m directory gespielt, sowie mit einigen der mit pyinotify mitgelieferten Beispielen gespielt. Was unklar ist, ist, wie ich die beiden zusammenfüge. Oder wenn ich es sollte. I könnte starten Sie einfach einen Thread, der eine Leitung verwendet, um inotifywait direkt ausführen, und schreiben Sie dann in eine RAM-Datei in /run, die ich eine io_add_watch eingerichtet hatte. Ich bin relativ neu bei glib/dbus/mainloop, also ist es immer noch eine Art Magie für mich. scheint etwas schwer für meine Zwecke, aber ich arbeite aus keiner Erfahrung hier.

Ich bin auf Debian Jessie laufen, mit Python3. Ich suche nichts über Plattform.

notifier = pyinotify.Notifier(wm, handler) 
wm.add_watch('/tmp', pyinotify.IN_CREATE) 
notifier.loop() 

Der vollständige Tutorial ist hier:

Antwort

1

Insbesondere zu weben das Zeug in einer dbus Schleife meldet, war der Trick, um ein ThreadedNotifier zu verwenden, um von pyinotify. Ich habe so etwas wie dies:

watchManager = pyinotify.WatchManager() 
inotifier = pyinotify.ThreadedNotifier(watchManager, FileEventHandler(mainService.eventStream)) 
inotifier.start() 
eventsPath = Path('/Pilot/Schedules') 
if not eventsPath.exists(): 
    eventsPath.mkdir() 
watchManager.add_watch(eventsPath.as_posix(), pyinotify.IN_CLOSE_WRITE | pyinotify.IN_DELETE, rec=True, auto_add=True) 

mainloop = glib.MainLoop() 
try: 
    mainloop.run() 
except KeyboardInterrupt: 
    mainloop.quit() 
    inotifier.stop() 

Meine FileEventHandler die Standardmethoden verwendet, wie process_IN_CLOSE_WRITE dann dbus Änderungen vor.