Відповідно до офіційних документів (за стандартними інтерфейсами ):
Існують деякі стандартні інтерфейси, які можуть бути корисні для різних програм D-Bus.
org.freedesktop.DBus.Introspectable
Цей інтерфейс має один метод:
org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)
Екземпляри об'єктів можуть реалізовувати, Introspect
що повертає XML-
опис об'єкта, включаючи його інтерфейси (із сигналами та методами), об’єкти під ним у дереві шляху об'єкта та його властивості.
Ось ось дуже спрощений приклад, з якого слід розпочати. Він використовує xml.etree.ElementTree
та dbus
:
#!/usr/bin/env python
import dbus
from xml.etree import ElementTree
def rec_intro(bus, service, object_path):
print(object_path)
obj = bus.get_object(service, object_path)
iface = dbus.Interface(obj, 'org.freedesktop.DBus.Introspectable')
xml_string = iface.Introspect()
for child in ElementTree.fromstring(xml_string):
if child.tag == 'node':
if object_path == '/':
object_path = ''
new_path = '/'.join((object_path, child.attrib['name']))
rec_intro(bus, service, new_path)
bus = dbus.SystemBus()
rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')
Він рекурсивно вводить перспективи, org.freedesktop.UPower
починаючи з, наприклад, /org/freedesktop/UPower
і друкує всі шляхи об'єкта (назви вузлів):
/org/freedesktop/UPower
/org/freedesktop/UPower/Wakeups
/org/freedesktop/UPower/devices
/org/freedesktop/UPower/devices/DisplayDevice
/org/freedesktop/UPower/devices/battery_BAT0
/org/freedesktop/UPower/devices/line_power_ADP0
що в значній мірі ви отримаєте, якби використовували d-feet
(не те, що вам знадобиться):
Звичайно, ви можете легко отримати шляхи до об'єкта за допомогою командного рядка, наприклад, за допомогою gdbus
:
gdbus introspect --система --dest org.freedesktop.UPower --об'єкт-шлях \
/ org / freedesktop / UPower - повтор | awk '/ ^ * вузол / {print $ 2}'
/ org / freedesktop / UPower
/ org / freedesktop / UPower / Wakeups
/ org / freedesktop / UPower / пристрої
/ org / freedesktop / UPower / пристрої / DisplayDevice
/ org / freedesktop / UPower / пристрої / батарея_BAT0
/ org / freedesktop / UPower / пристрої / line_power_ADP0
У мене не qdbus
встановлено, але відповідно до цієї сторінки
qdbus --system org.freedesktop.UPower
має дати подібний результат.