2010-10-21 56 views
2

我需要在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”功能上是没有的。我不明白为什么?有没有办法做我想达到的目标?

回答

0

我猜的do_nothing方法是提供,但不可见。你是否试图盲目地称呼它?

什么是可见就是由Introspect方法,而这又依赖于_dbus_class_table类的属性,因此您需要更新已返回Introspect返回的d-Bus的方法的更新列表。

0

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

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

print(hasattr(greg, "do_nothing")) 

此外,我们将不胜感激,如果你能在未来更加注重Python代码风格指南: http://www.python.org/dev/peps/pep-0008/