将方法添加到python中的dbus对象中
问题描述:
我需要在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()
在这种情况下,函数“舞”是可用的界面,但“do_nothing”功能上是没有的。我不明白为什么?有没有办法做我想达到的目标?
答
我猜的do_nothing
方法是提供,但不可见。你是否试图盲目地称呼它?
什么是可见就是由Introspect
方法,而这又依赖于_dbus_class_table
类的属性,因此您需要更新已返回Introspect
返回的d-Bus的方法的更新列表。
答
func()没有dbus服务头,所以无法识别。 当greg对象不包含这样的属性时,如何为函数设置“do_nothing”?
检查对象是否具有属性以确保您的语句将成功完成。
print(hasattr(greg, "do_nothing"))
此外,我们将不胜感激,如果你能在未来更加注重Python代码风格指南: http://www.python.org/dev/peps/pep-0008/