Gemäß den offiziellen Dokumenten (unter Standardschnittstellen ):
Es gibt einige Standardschnittstellen, die für verschiedene D-Bus-Anwendungen nützlich sein können.
org.freedesktop.DBus.Introspectable
Diese Schnittstelle hat eine Methode:
org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)
Es können
Objektinstanzen implementiert werden, Introspect
die eine XML- Beschreibung des Objekts, einschließlich seiner Schnittstellen (mit Signalen und Methoden), darunter liegender Objekte in der Objektpfadstruktur und seiner Eigenschaften, zurückgeben.
Hier ist ein sehr vereinfachtes Beispiel, das Ihnen den Einstieg erleichtern soll. Es verwendet xml.etree.ElementTree
und 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')
Es prüft rekursiv org.freedesktop.UPower
ab zB /org/freedesktop/UPower
und gibt alle Objektpfade (Knotennamen) aus:
/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
Das ist so ziemlich das, was Sie bekommen würden, wenn Sie es benutzen würden d-feet
(nicht, dass Sie es brauchen würden):
Natürlich können Sie die Objektpfade einfach über die Befehlszeile abrufen, z. B . gdbus
:
gdbus introspect --system --dest org.freedesktop.UPower --objektpfad \
/ 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
Ich habe qdbus
aber laut dieser Seite nicht installiert
qdbus --system org.freedesktop.UPower
sollte ein ähnliches Ergebnis erzeugen.