python 用于监视目录更改的 dbus 方法?

python dbus method for watching a directory change?

我已经在我的 dbus 主循环中成功地使用 python 绑定到 io_add_watch 来响应已知单个文件中的更改。但我现在有一个案例,我正在 运行 设置一个 dbus 主循环,并且需要在目录更改时工作。

我玩过命令行工具 inotifywait -m directory,也玩过 pyinotify 提供的一些示例。不清楚的是我是如何将两者放在一起的。或者如果我什至应该。我 可以 直接启动一个使用管道到 运行 inotifywait 的线程,然后写入我已经建立的 /run 中的 ram 文件一个io_add_watch来。我对 glib/dbus/mainloop 比较陌生,所以它对我来说仍然有点神奇。 pyinotify 对我来说似乎有点沉重,但我在这里没有任何经验。

我正在 运行使用 Debian Jessie,使用 python3。我不是在寻找任何跨平台的东西。

PyInotify 可以轻松监视一个目录:

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

完整教程在这里:https://github.com/seb-m/pyinotify/wiki/Tutorial#1-using-the-notifier-class-without-timeout

特别是要用 dbus 循环编织通知内容,诀窍是使用 pyinotify 中的 ThreadedNotifier。我使用了这样的东西:

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()

我的 FileEventHandler 使用标准方法,例如 process_IN_CLOSE_WRITE 然后提交 dbus 更改。