dbus 서비스에서 모든 개체 경로를 나열하는 방법은 무엇입니까?

dbus 서비스에서 모든 개체 경로를 나열하는 방법은 무엇입니까?

후속 질문입니다사용 가능한 DBus 서비스 목록.

다음 Python 코드는 사용 가능한 모든 DBus 서비스를 나열합니다.

import dbus
for service in dbus.SystemBus().list_names():
    print(service)

Python의 서비스 아래에 개체 경로를 어떻게 나열할 수 있나요? 답변에 Python이 포함되지 않아도 괜찮지만 선호됩니다.

우분투 14.04를 사용하고 있습니다

답변1

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.UPowereg부터 시작하여 재귀적으로 검사 /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(꼭 필요한 것은 아닙니다):

여기에 이미지 설명을 입력하세요.

답변2

Python에서 프로그래밍 방식으로 이 작업을 수행할 수 있는지 잘 모르겠습니다. 아마 그럴 수도 있겠지만, 어떻게 될지 알아내는 것은 엄청난 골치 아픈 일이 될 수 있습니다. 나는 전에 이것을 시도했지만 결국 Dbus를 싫어하게 되었습니다. 어쨌든 나는 사용하는 것이 좋습니다D 피트사물을 조사하고 싶다면. 아래는 내 컴퓨터에서 훔친 스크린샷입니다.블로그.

여기에 이미지 설명을 입력하세요.

프로그램 이름, 객체 경로 등을 알고 나면 Python을 사용하여 이에 액세스할 수 있습니다.

progname = 'org.freedesktop.NetworkManager'
objpath  = '/org/freedesktop/NetworkManager'
intfname = 'org.freedesktop.NetworkManager'
methname = 'GetDevices'

bus = dbus.SystemBus()

obj = bus.get_object(progname, objpath)
interface = dbus.Interface(obj, intfname)     # Get the interface to obj
method = interface.get_dbus_method(methname)  # The method on that interface

method()                                      # And finally calling the method

보시다시피, 간단한 일을 끝내는 것은 고통스럽습니다. 하지만 이것은 Dbus로 얻을 수 있는 가장 간단한 작업 흐름입니다!

따라서 GUI 도구를 사용하여 개체 경로, 인터페이스 등을 찾으십시오. 그런 다음 위의 코드 조각을 템플릿으로 사용하여 이러한 항목에 액세스하세요. 또는 IPython의 인터프리터를 통해 이 작업을 수행하여 각 객체에 어떤 메서드, 속성 등이 있는지 확인하는 것이 좋습니다(탭을 클릭하여).

답변3

서비스에 객체 구현이 있는 경우 org.freedesktop.DBus.ObjectManager해당 메소드는 GetManagedObjects다음을 반환합니다."단일 메소드 호출 내의 모든 객체, 인터페이스 및 속성."예를 들어 UDisks2에는 이러한 개체가 있습니다.

답변4

내 경험에 따르면 버스 이름(서비스)의 개체 경로를 가져오는 것은 자체 검사를 위해 개체 경로 "/"를 사용하여 수행할 수 있다는 것을 알고 있습니다. 즉(위의 예 사용)

introspectfunc('org.freedesktop.UPower', '/') 

그러면 다음이 반환되어야 합니다.

<node name="/"> 
<node name="org"/>
<node name="org"/>
<node name="org"/>
<node name="org"/>
<node name="org"/>
<node name="org"/></node>

그런 다음 내부 검사를 위해 '/org' 경로를 사용합니다.

introspectfunc('org.freedesktop.UPower', '/org')

그러면 다음이 반환되어야 합니다.

<node name="/org"> 
<node name="freedesktop"/>
<node name="freedesktop"/>
<node name="freedesktop"/>
<node name="freedesktop"/>
<node name="freedesktop"/>
<node name="freedesktop"/></node>

등:

introspectfunc('org.freedesktop.UPower', '/org/freedesktop')
introspectfunc('org.freedesktop.UPower', '/org/freedesktop/UPower')
etc.

이는 개체 경로 "/"가 루트이고 각 노드가 하위 폴더인 하드 드라이브의 폴더 구조를 탐색하는 것과 같습니다. 이는 특정 버스 이름(서비스)에 대한 객체 경로를 검색하고 객체 경로를 포함하는 컬렉션을 구성하는 가장 좋은 방법인 것 같습니다.

관련 정보