在所有python dbus文档中都有关于如何导出对象,接口和信号的信息,但是没有任何方法可以导出接口属性。
任何想法如何做到这一点?
答案 0 :(得分:12)
绝对可以在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='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 mailing list,或附加到错误filed against dbus-python on the FreeDesktop bugtracker。
答案 1 :(得分:2)
这个例子不起作用我认为是因为:
''” 可用的属性以及它们是否可写可以通过调用org.freedesktop.DBus.Introspectable.Introspect来确定,请参阅“org.freedesktop.DBus.Introspectable”一节。 '''
并且在内省数据中缺少属性:
我使用dbus-python-1.1.1