Python Dbus:如何导出接口属性

Posted

技术标签:

【中文标题】Python Dbus:如何导出接口属性【英文标题】:Python Dbus : How to export Interface property 【发布时间】:2011-04-14 01:03:33 【问题描述】:

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

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

【问题讨论】:

“导出接口属性”到底是什么意思? 我只是想创建一个 Dbus 属性。但是最近发现用python不行。 【参考方案1】:

绝对可以在 Python 中实现 D-Bus 属性! D-Bus 属性只是特定接口上的方法,即org.freedesktop.DBus.Properties。接口定义in the D-Bus specification;您可以像实现任何其他 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='asv')
    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='sasvas')
    def PropertiesChanged(self, interface_name, changed_properties,
                          invalidated_properties):
        pass

dbus-python 应该可以更轻松地实现属性,但目前充其量只是很少维护。

如果有人喜欢潜入并帮助解决这样的问题,他们将受到欢迎。即使将这个样板的扩展版本添加到文档中也是一个开始,因为这是一个非常常见的问题。有兴趣的可以发补丁到D-Bus mailing list,或者附上bug filed against dbus-python on the FreeDesktop bugtracker.

【讨论】:

我贡献了用于向bug 26903 添加属性的代码。【参考方案2】:

我认为这个例子行不通,因为:

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

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

我使用 dbus-python-1.1.1

【讨论】:

实现自省是可选的,主要是为了交互式调试:使用您的 API 的应用程序应该已经知道它期望的 API。因此,不包含在自省数据中的属性并不理想,但应该不是主要问题。 (您可能可以手动扩展 Introspect 接口的实现以包含属性。)

以上是关于Python Dbus:如何导出接口属性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 在自定义 dbus 上导出对象?

如何在python的扩展类中使用dbus导出方法,继承方法?

在 Python 中为 dbus 接口自动生成接口实现?

QDBusAbstractAdaptor 对象不导出实现的 dbus 接口

DBus 接口属性

使用 QDBusInterface 获取 DBus 接口属性时出错