후속 질문입니다사용 가능한 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.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
(꼭 필요한 것은 아닙니다):
답변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.
이는 개체 경로 "/"가 루트이고 각 노드가 하위 폴더인 하드 드라이브의 폴더 구조를 탐색하는 것과 같습니다. 이는 특정 버스 이름(서비스)에 대한 객체 경로를 검색하고 객체 경로를 포함하는 컬렉션을 구성하는 가장 좋은 방법인 것 같습니다.