2010-09-18 5 views
4

Dans toutes les documentations python dbus, il y a des informations sur la façon d'exporter des objets, des interfaces, des signaux, mais il n'y a rien pour exporter la propriété d'interface.Python Dbus: Comment exporter la propriété d'interface

Des idées comment faire cela?

+0

Que voulez-vous dire par "propriété d'interface d'exportation"? – detly

+0

Je voulais simplement créer une propriété Dbus. Mais récemment, j'ai trouvé qu'il n'est pas possible de faire avec python. – deimus

Répondre

11

Il est définitivement possible d'implémenter les propriétés D-Bus en Python! Les propriétés D-Bus ne sont que des méthodes sur une interface particulière, à savoir org.freedesktop.DBus.Properties. L'interface est définie in the D-Bus specification; vous pouvez l'appliquer à votre classe comme vous implémentez une autre interface 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 devrait faciliter la mise en œuvre de propriétés, mais il est actuellement très légèrement maintenu au mieux.

Si quelqu'un avait envie de plonger et d'aider à réparer des choses comme ça, il serait le bienvenu. Même l'ajout d'une version étendue de cette documentation à la documentation serait un début, car il s'agit d'une question assez fréquemment posée. Si vous êtes intéressé, les correctifs peuvent être envoyés au D-Bus mailing list ou attachés aux bogues filed against dbus-python on the FreeDesktop bugtracker.

+3

J'ai contribué mon code pour ajouter des propriétés à [bug 26903] (https://bugs.freedesktop.org/show_bug.cgi?id=26903). – Teddy

2

cet exemple ne fonctionne pas, je pense, parce que:

« » » Les propriétés disponibles et si elles sont inscriptibles peuvent être déterminées en appelant org.freedesktop.DBus.Introspectable.Introspect, voir la section intitulée « org .freedesktop.DBus.Introspectable ". '' »

et dans les données d'introspection la propriété sont manquants:

J'utilise dbus-python-1.1.1

+0

La mise en œuvre de l'introspection est facultative et concerne principalement le débogage interactif: une application utilisant votre API doit déjà connaître l'API attendue. Ainsi, les propriétés qui ne sont pas incluses dans les données d'introspection ne sont pas idéales, mais ne devraient pas être un problème majeur. (Vous pouvez probablement étendre manuellement l'implémentation de l'interface Introspect pour inclure les propriétés.) – wjt