Zgodnie z oficjalnymi dokumentami (w standardowych interfejsach ):
Istnieje kilka standardowych interfejsów, które mogą być przydatne w różnych aplikacjach D-Bus.
org.freedesktop.DBus.Introspectable
Ten interfejs ma jedną metodę:
org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)
Instancje obiektów mogą implementować, Introspect
która zwraca
opis XML obiektu, w tym jego interfejsów (z sygnałami i metodami), obiektów pod nim w drzewie ścieżki obiektu i jego właściwości.
Oto więc bardzo uproszczony przykład, który powinien zacząć. Wykorzystuje xml.etree.ElementTree
i 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')
Rekurencyjnie introspektuje, org.freedesktop.UPower
zaczynając od np. /org/freedesktop/UPower
I drukuje wszystkie ścieżki obiektów (nazwy węzłów):
/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
co jest prawie tym, co byś otrzymał, gdybyś go użył d-feet
(nie żebyś go potrzebował):
Pewnie, możesz łatwo uzyskać ścieżki obiektu za pomocą wiersza poleceń, np. Za pomocą 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
Nie qdbus
zainstalowałem, ale zgodnie z tą stroną
qdbus --system org.freedesktop.UPower
powinien dać podobny wynik.