这是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
这个接口有一个方法:
Run Code Online (Sandbox Code Playgroud)org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)
对象实例可以实现
Introspect
它返回对象的XML 描述,包括它的接口(带有信号和方法)、对象路径树中它下面的对象及其属性。
因此,这里有一个非常简单的示例,可以帮助您入门。它使用xml.etree.ElementTree
和dbus
:
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
(不是您需要它):
我不确定您是否可以在 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 的解释器执行此操作,以查看每个对象具有哪些方法、属性等(通过点击选项卡)。