Это дополнительный вопрос к списку доступных сервисов DBus .
В следующем коде Python перечислены все доступные службы DBus.
import dbus
for service in dbus.SystemBus().list_names():
print(service)
Как мы перечисляем пути к объектам в службах в Python? Это нормально, если ответ не включает в себя Python, хотя это предпочтительнее.
Я использую Ubuntu 14.04
Ответы:
Согласно официальным документам (под стандартными интерфейсами ):
Итак, вот очень упрощенный пример, с которого стоит начать. Он использует
xml.etree.ElementTree
иdbus
:Он рекурсивно анализирует,
org.freedesktop.UPower
начиная, например,/org/freedesktop/UPower
и печатает все пути объектов (имена узлов):который в значительной степени то , что вы получите , если вы использовали
d-feet
(не то, что вам нужно это):Конечно, вы можете легко получить пути к объектам через командную строку, например
gdbus
:Я не
qdbus
установил, но в соответствии с этой страницейдолжен дать аналогичный результат.
источник
rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')
?k = rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')
. Я полагаю, это возможно, немного изменив функцию.bus = dbus.SessionBus()..... obj_path = '/org/gnome/Gnote/RemoteControl'.......... cmd = 'qdbus org.gnome.Gnote'......... while obj_path not in ((subprocess.check_output(cmd, shell=True)).decode("utf-8")).split("\n"): ........pass
mylist=[]
затем заменитеprint
наmylist.append
и затем в качестве последней команды в этом функциональном блокеreturn mylist
- это почти то, что есть ... затем вы можете выполнить итерации по списку или что угодно, например, добавить внизу скриптаfor x in mylist: print("OBJ_PATH", x)
чтобы они были напечатаны сOBJ_PATH
префиксом ...Я не уверен, что вы можете сделать это программно в Python. Вы могли бы, но это будет огромная головная боль, чтобы выяснить, как. Я пытался сделать это раньше и закончил ненавидеть Dbus. Во всяком случае, я рекомендую использовать D-ноги, если вы хотите исследовать вещи. Ниже приведен скриншот, который я украл из своего блога .
Когда вы знаете имя программы, путь к объекту и т. Д., Вы можете использовать Python для доступа к этим вещам.
пример
Как вы видите, это задница в том, чтобы сделать простую вещь. Но это самый простой рабочий процесс, который вы можете получить с помощью Dbus!
Поэтому используйте инструмент с графическим интерфейсом, чтобы узнать пути к объектам, интерфейсы и т. Д. Затем используйте приведенный выше фрагмент кода в качестве шаблона для доступа к этим вещам. Также я предлагаю вам сделать это через интерпретатор IPython, чтобы увидеть, какие методы, свойства и т. Д. У каждого объекта (нажав на вкладку).
источник
Если у службы есть реализация объекта
org.freedesktop.DBus.ObjectManager
, ее методGetManagedObjects
возвращает «все объекты, интерфейсы и свойства в одном вызове метода». Например, UDisks2 имеет такой объект.источник
То, что я знаю из своего опыта, чтобы получить пути к объектам имени шины (службы), можно проанализировать с помощью пути к объекту '/', т. Е. (Используя приведенный выше пример)
это должно вернуть:
затем самоанализ с путем '/ org'
это должно вернуть:
и так далее:
Это похоже на просмотр структуры папок жесткого диска, где путь к объекту '/' является корневым, а каждый узел - подпапкой. Это кажется наилучшим способом получения путей к объектам определенного имени шины (службы) и создания коллекции, содержащей пути к объектам.
источник
В соответствии с #don_crissti отвечает, я реализовал, Это решение дает имя интерфейса и метод и сигнализирует информацию
источник