Python
如何列出 dbus 服務下的所有對象路徑?
這是A list of available DBus services的後續問題。
以下 python 程式碼將列出所有可用的 DBus 服務。
import dbus for service in dbus.SystemBus().list_names(): print(service)
我們如何在python中列出服務下的對象路徑?如果答案不涉及 python 是可以的,儘管它是首選。
我正在使用 Ubuntu 14.04
QT
設置提供了最方便的方法,通過qdbus
:qdbus --system org.freedesktop.UPower
印刷
/ /org /org/freedesktop /org/freedesktop/UPower /org/freedesktop/UPower/Wakeups /org/freedesktop/UPower/devices /org/freedesktop/UPower/devices/line_power_ADP0 /org/freedesktop/UPower/devices/DisplayDevice /org/freedesktop/UPower/devices/battery_BAT0
至於python方式……根據官方文件(在標準介面下):
有一些標準介面可能對各種 D-Bus 應用程序有用。
org.freedesktop.DBus.Introspectable
這個介面有一個方法:
org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)
對象實例可以實現
Introspect
返回對象的XML 描述,包括它的介面(帶有信號和方法)、對象路徑樹中它下面的對象,以及它的屬性。因此,這是一個非常簡單的範例,可以幫助您入門。它使用
xml.etree.ElementTree
和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')
org.freedesktop.UPower
它從 eg 開始遞歸自省/org/freedesktop/UPower
並列印所有對象路徑(節點名稱):/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
如果你使用它,這幾乎是你得到的
d-feet
(不是你需要它):