Selon les documents officiels (sous les interfaces standard ):
Il existe certaines interfaces standard qui peuvent être utiles dans diverses applications D-Bus.
org.freedesktop.DBus.Introspectable
Cette interface a une méthode:
org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)
Les instances d'objets peuvent implémenter Introspect
qui renvoie une
description XML de l'objet, y compris ses interfaces (avec des signaux et des méthodes), les objets situés en dessous dans l'arborescence du chemin d'objet et ses propriétés.
Voici donc un exemple très simpliste qui devrait vous aider à démarrer. Il utilise xml.etree.ElementTree
et 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')
Il introspecte récursivement à org.freedesktop.UPower
partir de par exemple/org/freedesktop/UPower
et imprime tous les chemins d'objet (noms de noeud):
/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
ce qui est à peu près ce que vous obtiendriez si vous l'utilisiez d-feet
(pas que vous en auriez besoin):
Bien sûr, vous pouvez facilement obtenir les chemins des objets via la ligne de commande, par exemple avec 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 / appareils
/ org / freedesktop / UPower / devices / DisplayDevice
/ org / freedesktop / UPower / devices / battery_BAT0
/ org / freedesktop / UPower / devices / line_power_ADP0
Je n'ai pas qdbus
installé mais selon cette page
qdbus --system org.freedesktop.UPower
devrait produire un résultat similaire.