Según los documentos oficiales (bajo interfaces estándar ):
Hay algunas interfaces estándar que pueden ser útiles en varias aplicaciones de D-Bus.
org.freedesktop.DBus.Introspectable
Esta interfaz tiene un método:
org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)
Se pueden implementar instancias de objetos Introspect
que devuelven una
descripción XML del objeto, incluidas sus interfaces (con señales y métodos), los objetos debajo de él en el árbol de ruta del objeto y sus propiedades.
Así que aquí hay un ejemplo muy simple que debería comenzar. Utiliza xml.etree.ElementTree
y 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')
Introspectivamente recursivamente a org.freedesktop.UPower
partir de, por ejemplo, /org/freedesktop/UPower
e imprime todas las rutas de objetos (nombres de nodo):
/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
que es más o menos lo que obtendrías si lo usaras d-feet
(no es que lo necesites):
Claro, puede obtener fácilmente las rutas de los objetos a través de la línea de comandos, por ejemplo, con gdbus
:
gdbus introspect --system --dest org.freedesktop.UPower --object-path \
/ org / freedesktop / UPower --recurse | awk '/ ^ * node / {print $ 2}'
/ 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
No lo he qdbus
instalado pero según esta página
qdbus --system org.freedesktop.UPower
debería producir un resultado similar.