2

我需要使用在运行时确定的方法名称在 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”不可用。我不明白为什么?有没有办法做我想要实现的目标?

4

2 回答 2

0

我猜该do_nothing方法可用,但不可见。您是否尝试过盲目称呼它?

可见的是方法返回的内容Introspect,这又取决于_dbus_class_table类属性,因此您需要更新它以Introspect返回更新后的 D-Bus 方法列表。

于 2011-02-17T18:44:46.200 回答
0

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

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

print(hasattr(greg, "do_nothing"))

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

于 2013-10-04T04:45:31.350 回答