Python Dbus: как экспортировать свойство интерфейса - PullRequest
5 голосов
/ 18 сентября 2010

Во всех документах Python dbus есть информация о том, как экспортировать объекты, интерфейсы, сигналы, но нет ничего, как экспортировать свойства интерфейса.

Есть идеи, как это сделать?

Ответы [ 2 ]

12 голосов
/ 25 сентября 2010

Определенно возможно реализовать свойства D-Bus в Python! Свойства D-Bus - это просто методы для определенного интерфейса, а именно org.freedesktop.DBus.Properties. Интерфейс определен в спецификации D-Bus ; Вы можете реализовать его в своем классе так же, как и любой другой интерфейс 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 должен облегчить реализацию свойств, но в настоящее время он поддерживается в лучшем случае очень легко.

Если кому-то захочется окунуться и помочь исправить подобные вещи, они будут очень рады. Даже добавление расширенной версии этого шаблона в документацию было бы началом, так как это довольно часто задаваемый вопрос. Если вам интересно, патчи могут быть отправлены в список рассылки D-Bus или прикреплены к ошибкам , зарегистрированным для dbus-python в багтрекере FreeDesktop .

2 голосов
/ 29 ноября 2012

этот пример не работает, я думаю, потому что:

''» Доступные свойства и возможность их записи можно определить, вызвав org.freedesktop.DBus.Introspectable.Introspect, см. Раздел «org.freedesktop.DBus.Introspectable». '' '

и в данных самоанализа свойство отсутствует:

Я использую dbus-python-1.1.1

...