Esta es una pregunta de seguimiento a una lista de servicios DBus disponibles .
El siguiente código de Python enumerará todos los servicios DBus disponibles.
import dbus
for service in dbus.SystemBus().list_names():
print(service)
¿Cómo enumeramos las rutas de objetos bajo los servicios en Python? Está bien si la respuesta no involucra a Python, aunque es preferible.
Estoy usando Ubuntu 14.04
Respuestas:
Según los documentos oficiales (bajo interfaces estándar ):
Así que aquí hay un ejemplo muy simple que debería comenzar. Utiliza
xml.etree.ElementTree
ydbus
:Introspectivamente recursivamente a
org.freedesktop.UPower
partir de, por ejemplo,/org/freedesktop/UPower
e imprime todas las rutas de objetos (nombres de nodo):que es más o menos lo que obtendrías si lo usaras
d-feet
(no es que lo necesites):Claro, puede obtener fácilmente las rutas de los objetos a través de la línea de comandos, por ejemplo, con
gdbus
:No lo he
qdbus
instalado pero según esta páginadebería producir un resultado similar.
fuente
rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')
?k = rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')
. Supongo que es posible modificando un poco la función.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=[]
luego reemplácelaprint
conmylist.append
y luego como el último comando en ese bloque de funcionesreturn mylist
: eso es más o menos lo que hay ... luego puede iterar sobre la lista o lo que sea, por ejemplo, agregar al final del scriptfor x in mylist: print("OBJ_PATH", x)
para que se impriman con unOBJ_PATH
prefijo ...No estoy seguro de que pueda hacer esto mediante programación en Python. Podría, pero será un gran dolor de cabeza descubrir cómo. Traté de hacerlo antes y terminé odiando a Dbus. De todos modos, recomiendo usar d-pies si quieres investigar cosas. A continuación hay una captura de pantalla que robé de mi blog .
Una vez que sepa el nombre del programa, la ruta del objeto, etc., puede usar Python para acceder a esas cosas.
Ejemplo
Como puede ver, es un fastidio hacer algo simple. ¡Pero este es el flujo de trabajo más fácil que puede obtener con Dbus!
Entonces, use una herramienta GUI para descubrir las rutas de objetos, interfaces, etc. Luego use el fragmento de código anterior como plantilla para acceder a esas cosas. También le sugiero que haga esto a través del intérprete de IPython para ver qué métodos, propiedades, etc. tiene cada objeto (presionando la pestaña).
fuente
Si el servicio tiene un objeto implementado
org.freedesktop.DBus.ObjectManager
, su métodoGetManagedObjects
devuelve "todos los objetos, interfaces y propiedades en una sola llamada al método". Por ejemplo, UDisks2 tiene dicho objeto.fuente
Lo que sé por experiencia para obtener las rutas de objetos de un nombre de bus (servicio) es posible introspectar con la ruta de objetos '/', es decir (usando el ejemplo anterior)
esto debería devolver:
luego introspect con path '/ org'
esto debería devolver:
y así:
Es como recorrer la estructura de carpetas del disco duro donde la ruta del objeto '/' es la raíz y cada nodo es una subcarpeta. Esta parece ser la mejor manera de recuperar las rutas de objetos de un nombre de bus (servicio) en particular y construir una colección que contenga las rutas de objetos
fuente
Según las respuestas de #don_crissti , implementé, esta solución proporciona información sobre el nombre y el método de la interfaz y las señales
fuente