6

在所有 python dbus 文档中都有关于如何导出对象、接口、信号的信息,但是没有关于如何导出接口属性的信息。

任何想法如何做到这一点?

4

2 回答 2

13

在 Python 中实现 D-Bus 属性绝对是可能的!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 邮件列表,或者附加到FreeDesktop bugtracker 上针对 dbus-python 提交的错误中

于 2010-09-24T22:48:25.357 回答
2

我认为这个例子不起作用,因为:

''' 可用属性及其是否可写可以通过调用 org.freedesktop.DBus.Introspectable.Introspect 来确定,参见“org.freedesktop.DBus.Introspectable”一节。'''

并且在自省数据中缺少该属性:

我使用 dbus-python-1.1.1

于 2012-11-29T15:43:35.117 回答