在python中向dbus对象添加方法
Posted
技术标签:
【中文标题】在python中向dbus对象添加方法【英文标题】:Adding methods to a dbus object in python 【发布时间】:2011-04-28 09:23:34 【问题描述】:我需要在 python 中创建一个 dbus 对象,其方法名称在运行时决定。
我试过的代码基本上是这样的:
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
import gobject
DBusGMainLoop(set_as_default=True)
gobject.threads_init()
class greg(dbus.service.Object):
def __init__(self):
dbus.service.Object.__init__(self, bus, "/greg")
@dbus.service.method(
dbus_interface="com.blah.blah",
in_signature="",
out_signature="")
def dance(self):
print "*busts a move*"
def func(self):
pass
func = dbus.service.method(
dbus_interface="com.blah.blah",
in_signature="",
out_signature="")(func)
setattr(greg, "do_nothing", func)
bus = dbus.SystemBus()
busname = dbus.service.BusName("com.blah.blah", bus)
obj = greg()
loop = gobject.MainLoop()
loop.run()
在这种情况下,功能“舞蹈”在界面上可用,但功能“do_nothing”不可用。我不明白为什么?有没有办法做我想要实现的目标?
【问题讨论】:
【参考方案1】:我猜do_nothing
方法可用,但不可见。你有没有试过盲目地称呼它?
什么是可见 是Introspect
方法返回的内容,这又取决于_dbus_class_table
类属性,因此您需要更新它以使Introspect
返回更新的D-Bus 方法列表。
【讨论】:
【参考方案2】:func() 没有 dbus 服务标头,因此无法识别。 当 greg 对象不包含此类属性时,如何将“do_nothing”设置为您的函数?
检查对象是否具有该属性,以确保您的语句将成功完成。
print(hasattr(greg, "do_nothing"))
另外,如果您以后能更多地关注 Python 代码样式指南,我们将不胜感激: http://www.python.org/dev/peps/pep-0008/
【讨论】:
以上是关于在python中向dbus对象添加方法的主要内容,如果未能解决你的问题,请参考以下文章