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

Posted

技术标签:

【中文标题】用于监视目录更改的python dbus方法?【英文标题】:python dbus method for watching a directory change? 【发布时间】:2016-04-23 00:04:29 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

这名义上很有帮助,我最终想通了,请参阅我添加的答案。我希望它会更像那样,但你得到了让我朝着正确方向前进的信任。【参考方案2】:

特别是要在 dbus 循环中编织通知内容,诀窍是使用来自 pyinotifyThreadedNotifier。我用过这样的东西:

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更改。

【讨论】:

以上是关于用于监视目录更改的python dbus方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 inotifywait 的情况下监视目录的文件更改?

DBus-monitor 监视蓝牙活动

使用 kqueue() 监视目录更改的最佳方法是啥?

更改模块目录后的 Python 酸洗

python:简单的 dbus 示例-服务例程中的 os.fork()?

PowerManagement.Inhibit 适用于 dbus-python 但不适用于 dbus-send