Python Dbus: cómo exportar propiedad de interfaz

En todas las documentaciones de dbus de Python hay información sobre cómo exportar objetos, interfaces, señales, pero no hay nada sobre cómo exportar propiedades de interfaz.

¿Alguna idea de cómo hacer eso?

¡Definitivamente es posible implementar las propiedades de D-Bus en Python! Las propiedades de D-Bus son solo métodos en una interfaz particular, es decir, org.freedesktop.DBus.Properties . La interfaz se define en la especificación D-Bus ; puede implementarlo en su clase al igual que implementa cualquier otra interfaz D-Bus:

 # Untested, just off the top of my head import dbus MY_INTERFACE = 'com.example.Foo' class Foo(dbus.service.object): # … @dbus.service.method(interface=dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v') def Get(self, interface_name, property_name): return self.GetAll(interface_name)[property_name] @dbus.service.method(interface=dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}') def GetAll(self, interface_name): if interface_name == MY_INTERFACE: return { 'Blah': self.blah, # … } else: raise dbus.exceptions.DBusException( 'com.example.UnknownInterface', 'The Foo object does not implement the %s interface' % interface_name) @dbus.service.method(interface=dbus.PROPERTIES_IFACE, in_signature='ssv'): def Set(self, interface_name, property_name, new_value): # validate the property name and value, update internal state… self.PropertiesChanged(interface_name, { property_name: new_value }, []) @dbus.service.signal(interface=dbus.PROPERTIES_IFACE, signature='sa{sv}as') def PropertiesChanged(self, interface_name, changed_properties, invalidated_properties): pass 

dbus-python debería facilitar la implementación de las propiedades, pero actualmente, en el mejor de los casos, su mantenimiento es muy ligero.

Si alguien quisiera bucear y ayudar a arreglar este tipo de cosas, serían bienvenidos. Incluso agregar una versión expandida de este texto estándar a la documentación sería un comienzo, ya que esta es una pregunta muy frecuente. Si está interesado, los parches podrían enviarse a la lista de correo de D-Bus o adjuntarse a errores archivados contra dbus-python en el rastreador de errores de FreeDesktop .

Este ejemplo no funciona, creo porque:

” ‘Las propiedades disponibles y si se pueden escribir se pueden determinar llamando a org.freedesktop.DBus.Introspectable.Introspect, consulte la sección llamada “org.freedesktop.DBus.Introspectable”. ” ‘

y en los datos de introspección faltan las propiedades:

Yo uso dbus-python-1.1.1