Theo tài liệu chính thức (theo giao diện tiêu chuẩn ):
Có một số giao diện tiêu chuẩn có thể hữu ích trên các ứng dụng D-Bus khác nhau.
org.freedesktop.DBus.Introspectable
Giao diện này có một phương thức:
org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)
Các thể hiện đối tượng có thể thực hiện Introspect
trả về một
mô tả XML của đối tượng, bao gồm các giao diện của nó (với các tín hiệu và phương thức), các đối tượng bên dưới nó trong cây đường dẫn đối tượng và các thuộc tính của nó.
Vì vậy, đây là một ví dụ rất đơn giản sẽ giúp bạn bắt đầu. Nó sử dụng xml.etree.ElementTree
và 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')
Nó đệ quy nội tâm org.freedesktop.UPower
bắt đầu từ ví dụ /org/freedesktop/UPower
và in tất cả các đường dẫn đối tượng (tên nút):
/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
đó là khá nhiều những gì bạn nhận được nếu bạn sử dụng d-feet
(không phải là bạn cần nó):
Chắc chắn, bạn có thể dễ dàng nhận được các đường dẫn đối tượng thông qua dòng lệnh, ví dụ như với gdbus
:
gdbus introspect --system --dest org.freedesktop.UPower --object-path \
/ org / freedesktop / UPower --recurse | awk '/ ^ * nút / {in $ 2}'
/ org / freedesktop / UPower
/ org / freedesktop / UPower / Wakeup
/ org / freedesktop / UPower / thiết bị
/ org / freedesktop / UPower / thiết bị / DisplayDevice
/ org / freedesktop / UPower / thiết bị / pin_BAT0
/ org / freedesktop / UPower / thiết bị / line_power_ADP0
Tôi chưa qdbus
cài đặt nhưng theo trang này
qdbus --system org.freedesktop.UPower
nên tạo ra một kết quả tương tự.