Conforme os documentos oficiais (em interfaces padrão ):
Existem algumas interfaces padrão que podem ser úteis em vários aplicativos D-Bus.
org.freedesktop.DBus.Introspectable
Essa interface possui um método:
org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)
Podem ser implementadas instâncias de objetos Introspect
que retornam uma
descrição XML do objeto, incluindo suas interfaces (com sinais e métodos), objetos abaixo dele na árvore de caminhos do objeto e suas propriedades.
Então, aqui está um exemplo muito simplista que deve ajudá-lo a começar. Usa xml.etree.ElementTree
e 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')
Introspecta recursivamente a org.freedesktop.UPower
partir de, por exemplo, /org/freedesktop/UPower
e imprime todos os caminhos de objetos (nomes de nós):
/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 é praticamente o que você obteria se usasse d-feet
(não que fosse necessário):
Claro, você pode facilmente obter os caminhos dos objetos via linha de comando, por exemplo, com gdbus
:
introspect gdbus --system --dest org.freedesktop.UPower --object-path \
/ org / freedesktop / UPower --recurse | awk '/ ^ * node / {print $ 2}'
/ org / freedesktop / UPower
/ org / freedesktop / UPower / Despertar
/ org / freedesktop / UPower / devices
/ org / freedesktop / UPower / devices / DisplayDevice
/ org / freedesktop / UPower / devices / battery_BAT0
/ org / freedesktop / UPower / devices / line_power_ADP0
Não tenho qdbus
instalado, mas de acordo com esta página
qdbus --system org.freedesktop.UPower
deve produzir um resultado semelhante.