Python

如何列出 dbus 服務下的所有對象路徑?

  • September 20, 2021

這是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.ElementTreedbus

#!/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(不是你需要它):

在此處輸入圖像描述

引用自:https://unix.stackexchange.com/questions/203410