如何选择和使用python3数据库总线库来替换数据库总线发送调用



使用ubuntu 20.10

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

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

我对数据库总线的编码一无所知。首先,我希望有一个好的python库。

我了解到这是关于明显的规范库:;dbus-python是一个遗留的API,使用不推荐使用的dbus-glib库构建,并涉及大量类型猜测(尽管"显式优于隐式"one_answers"抵制猜测的诱惑")(来自https://wiki.python.org/moin/DbusExamples)

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

我试着使用dasbus,但我无法安装必要的库,至少不能在虚拟环境中安装。尽管安装了系统包python3gi,我还是收到了错误";没有名为gi"的模块;并且尝试安装PyGObject失败,因为";找不到包"cairo"。。。和错误:为pycairo构建轮子失败。

因此,在这一点上,我有一个旧的、不推荐使用的库,一个有依赖性困难的库,还有一个似乎迫使我使用asyncio的库。

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

除此之外,我想我已经得出了以下几点:

我需要SessionBus

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

我觉得异步有点过头了,因为这是一个shell脚本,但如果这是我避免C依赖的唯一方法,我会处理它

我应该使用哪个图书馆?

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

我只使用过几次dbusnext库,如果您不想异步执行,它确实有各种*_sync方法。

首先,如何使用两个流行的易于安装的仅python MIT许可包

吉普尼

以下是如何使用吉普尼完成任务:

from jeepney import DBusAddress, new_method_call
from jeepney.io.blocking import open_dbus_connection
proxy = DBusAddress('/org/gnome/SessionManager',
bus_name='org.gnome.SessionManager',
interface='org.gnome.SessionManager')
connection = open_dbus_connection(bus='SESSION')
msg = new_method_call(proxy, 'GetInhibitors')
reply = connection.send_and_get_reply(msg)
print(reply.body[0])

dbus next

下面是如何在dbus中完成同样的操作。我不是异步方面的专家,但即使你的代码是非异步的(同步的),这似乎也能起作用:

import asyncio
from dbus_next.aio import MessageBus
from dbus_next.message import Message
async def main():
bus = await MessageBus().connect()
msg = Message(destination='org.gnome.SessionManager',
path='/org/gnome/SessionManager',
interface='org.gnome.SessionManager',
member='GetInhibitors')
return await bus.call(msg)

reply = asyncio.run(main())
print(reply.body[0])

我有什么选择

有很多选择。其中有些很容易安装,有些则不然。

包装是";硬";要安装

我通过在全新的虚拟环境中运行python -m pip install <packagename>,在全新的Ubuntu 22.04安装中测试了可安装性。这些软件包没有安装(因为它们有额外的依赖项):

  • dbus-python,它依赖于原始的dbus实现和libdbus
  • pydbus,它依赖于PyGObject(又名PyGI,导入名称为gi)。为丢失的gi模块安装,但在运行时引发异常
  • dasbus,它依赖于PyGObject,基本上是(已废弃的)pydbus项目的延续。为丢失的gi模块安装,但在运行时引发异常
  • pystemd,它为libsystemd提供Cython包装器

易于安装的软件包

  • jeepney,它是纯python,使用socket标准库模块实现零依赖。它还获得了麻省理工学院的许可。(文档)
  • dbusnext(您已经找到了)是另一个使用socket标准库模块的纯python零依赖实现。也就是说,当您使用异步dbus_next.aio子包中的MessageBus时(dbus_nxt.glib部分中的MessageBus需要PyGObject)。Dbus接下来是麻省理工学院的许可证。(文档)
  • sdbus,它依赖于libsystemd。这不是纯python,但在repo中有一些C文件。不确定安装是否总是无痛的:)它是根据LGPL-2.1&GPL-2.0
  • dbussy是一个小得多的项目,基本上是libdbus-1.so.3的ctypes包装(它要求在系统上可用)。这个共享库基本上是每个运行dbus守护进程(并使用dbus)的系统的一部分。有些人不喜欢libdbus(线程问题?至少互联网上这么说)。LGPL-2.1获得许可
  • pysdbus是一个很小的项目,与dbussy类似,但取决于系统上共享库libsystemd.so.0的可用性。这应该在任何运行systemd的系统中都可以使用(大多数流行的发行版都是这样)。LGPL-2.1获得许可

在这些天中,当前的

  • jeepney的下载量约为850000次/天
  • dbus next约1250次下载/天
  • sdbus每天约100次下载
  • dbussy 20/天

并且pysdbus未在PyPI中列出。所以吉普尼似乎真的是最受欢迎的选择,也许是因为安装方便。不过,它并没有针对速度进行优化。话虽如此,上面的代码示例在多次运行时,jeepney大约需要2毫秒,接下来dbus大约需要3毫秒。


  • 还有txdbus,它实际上只用于twisted(它甚至将twisted作为依赖项安装)
  • 也许值得一提的是,Ubuntu 22.04的安装附带了jeepneydbus(python-dbus)和gi(PyGObject)。不过,这对虚拟环境或本应作为依赖项(在venv内部)安装的项目没有帮助

最新更新