在python中向dbus对象添加方法

时间:2010-10-21 02:57:16

标签: python dbus

我需要在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()

在这种情况下,界面上可以使用'dance'功能,但不能使用'do_nothing'功能。我不明白为什么?有没有办法做我想要实现的目标?

2 个答案:

答案 0 :(得分:0)

我猜测do_nothing方法可用,但不是可见。你试图盲目地称呼它吗?

什么是可见Introspect方法返回的内容,而{1}}方法依赖于_dbus_class_table类属性,因此需要更新Introspect类属性{{1}} 1}}返回更新的D-Bus方法列表。

答案 1 :(得分:0)

func()没有dbus服务标头,因此无法识别。 当greg对象不包含这样的属性时,如何为函数设置“do_nothing”?

检查对象是否具有确保语句成功完成的属性。

print(hasattr(greg, "do_nothing"))

此外,如果您将来可以更加关注python代码样式指南,我们将不胜感激: http://www.python.org/dev/peps/pep-0008/