如何列出 dbus 服务下的所有对象路径?

use*_*421 21 d-bus python ipc

这是A list of available DBus services的后续问题。

以下 python 代码将列出所有可用的 DBus 服务。

import dbus
for service in dbus.SystemBus().list_names():
    print(service)
Run Code Online (Sandbox Code Playgroud)

我们如何在python中列出服务下的对象路径?如果答案不涉及 python 也没关系,尽管它是首选。

我正在使用 Ubuntu 14.04

don*_*sti 17

QT设置提供了最方便的方法,通过qdbus

qdbus --system org.freedesktop.UPower
Run Code Online (Sandbox Code Playgroud)

印刷

/
/org
/org/freedesktop
/org/freedesktop/UPower
/org/freedesktop/UPower/Wakeups
/org/freedesktop/UPower/devices
/org/freedesktop/UPower/devices/line_power_ADP0
/org/freedesktop/UPower/devices/DisplayDevice
/org/freedesktop/UPower/devices/battery_BAT0
Run Code Online (Sandbox Code Playgroud)

至于python方式......根据官方文档(在标准接口下):

有一些标准接口可能适用于各种 D-Bus 应用程序。

org.freedesktop.DBus.Introspectable

这个接口有一个方法:

org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)
Run Code Online (Sandbox Code Playgroud)

对象实例可以实现Introspect它返回对象的XML 描述,包括它的接口(带有信号和方法)、对象路径树中它下面的对象及其属性。

因此,这里有一个非常简单的示例,可以帮助您入门。它使用xml.etree.ElementTreedbus

qdbus --system org.freedesktop.UPower
Run Code Online (Sandbox Code Playgroud)

org.freedesktop.UPower从 eg 开始递归地反省/org/freedesktop/UPower并打印所有对象路径(节点名称):

/
/org
/org/freedesktop
/org/freedesktop/UPower
/org/freedesktop/UPower/Wakeups
/org/freedesktop/UPower/devices
/org/freedesktop/UPower/devices/line_power_ADP0
/org/freedesktop/UPower/devices/DisplayDevice
/org/freedesktop/UPower/devices/battery_BAT0
Run Code Online (Sandbox Code Playgroud)

如果您使用它,这几乎就是您所得到的d-feet(不是您需要它):

在此处输入图片说明


Pit*_*kos 7

我不确定您是否可以在 Python 中以编程方式执行此操作。你可能会,但要弄清楚如何做将是一个巨大的头痛。我以前尝试过,但最终讨厌 Dbus。无论如何,如果你想调查事情,我建议使用d-feet。下面是我从我的博客上偷来的截图。

在此处输入图片说明

一旦您知道程序名称、对象路径等,您就可以使用 Python 访问这些内容。

例子

progname = 'org.freedesktop.NetworkManager'
objpath  = '/org/freedesktop/NetworkManager'
intfname = 'org.freedesktop.NetworkManager'
methname = 'GetDevices'

bus = dbus.SystemBus()

obj  = bus.get_object(progname, objpath)  # Here we get object
intf = dbus.Interface(obj, intfname)      # Here we get interface
meth = inf.get_dbus_method(methname)      # Here we get method

meth()                                    # And finally calling the method
Run Code Online (Sandbox Code Playgroud)

如您所见,完成一件简单的事情是一件很痛苦的事情。但这是您可以使用 Dbus 获得的最简单的工作流程!

因此,使用 GUI 工具找出对象路径、接口等。然后使用上面的代码片段作为模板来访问这些内容。此外,我建议您通过 IPython 的解释器执行此操作,以查看每个对象具有哪些方法、属性等(通过点击选项卡)。