如何选择和使用 python3 dbus 库来替换 dbus-send 调用

How to choose and use a python3 dbus library to replace a dbus-send call

使用 ubuntu 20.10

我想写一个python脚本来处理这个shell命令的输出:

dbus-send --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.GetInhibitors

我对 dbus 编码一无所知。首先开始的地方是我希望有一个好的 python 库。

我了解到这个明显规范的库:“dbus-python 是遗留的 API,使用已弃用的 dbus-glib 库构建,并且涉及大量类型猜测(尽管“明确胜于含蓄”和“抵制猜测的诱惑”)(来自https://wiki.python.org/moin/DbusExamples

https://pypi.org/project/dbus-next/ 承诺纯 python 实现:“零依赖和纯 Python 3。” 上面提到的 wiki 页面上没有提到它,但它看起来是一个健康的项目。 但是,似乎纯 python 方法要求我使用 asyncio 版本。我认为这对我的需求来说太过分了。

我尝试使用 dasbus,但我无法安装必要的库,至少不能在虚拟环境中安装。 尽管安装了系统包 python3-gi,但我收到错误消息“没有名为 gi 的模块”并且尝试安装 PyGObject 失败,因为“没有找到包 'cairo'”...和错误:构建轮失败pycairo.

所以在这一点上,我有一个旧的不推荐的库,一个有依赖性困难的库和一个似乎迫使我使用 asyncio 的库。

我现在明白了为什么我试图在 python 中重写的 php 脚本执行了 shell 命令并处理了丑陋的输出。

除此之外,我想我已经解决了以下几点:

我需要会话总线

“路径”是“/org/gnome/SessionManager” “接口”是 org.gnome.SessionManager 我想“呼叫”“成员”GetInhibitors

我发现异步有点矫枉过正,因为这是一个 shell 脚本,但如果这是我避免 C 依赖的唯一方法,我会处理它。

我应该使用哪个库?

pydbus 是一个非常强大的库,它允许我快速简单地构建东西,尽管 repo 不一定那么活跃。

我只使用过几次 dbus-next 库,如果您不想异步执行操作,它确实有多种 *_sync 方法。