用于监视目录更改的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 循环中编织通知内容,诀窍是使用来自 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更改。
【讨论】:
以上是关于用于监视目录更改的python dbus方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 inotifywait 的情况下监视目录的文件更改?