Secondo i documenti ufficiali (con interfacce standard ):
Esistono alcune interfacce standard che possono essere utili in varie applicazioni D-Bus.
org.freedesktop.DBus.Introspectable
Questa interfaccia ha un metodo:
org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)
Le istanze di oggetti possono implementare ciò Introspect
che restituisce una
descrizione XML dell'oggetto, comprese le sue interfacce (con segnali e metodi), gli oggetti sottostanti nella struttura del percorso degli oggetti e le sue proprietà.
Quindi, ecco un esempio molto semplicistico che dovrebbe iniziare. Utilizza 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')
Introspettiva ricorsiva a org.freedesktop.UPower
partire da es. /org/freedesktop/UPower
E stampa tutti i percorsi degli oggetti (nomi dei nodi):
/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
che è praticamente quello che otterresti se lo usassi d-feet
(non che ne avresti bisogno):
Certo, puoi facilmente ottenere i percorsi degli oggetti dalla riga di comando, ad esempio con gdbus
:
gdbus introspect --system --dest org.freedesktop.UPower - percorso-oggetto \
/ org / freedesktop / UPower --recurse | awk '/ ^ * node / {print $ 2}'
/ Org / freedesktop / UPower
/ Org / freedesktop / UPower / wakeups
/ org / freedesktop / UPower / devices
/ Org / freedesktop / UPower / dispositivi / DisplayDevice
/ Org / freedesktop / UPower / dispositivi / battery_BAT0
/ Org / freedesktop / UPower / dispositivi / line_power_ADP0
Non ho qdbus
installato ma secondo questa pagina
qdbus --system org.freedesktop.UPower
dovrebbe produrre un risultato simile.