2010-10-21 4 views
2

J'ai besoin de créer un objet dbus en python avec les noms de méthodes qui sont décidés lors de l'exécution.Ajout de méthodes à un objet dbus en python

Le code que j'ai essayé est essentiellement ceci:

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() 

Dans ce cas, la fonction « danse » est disponible sur l'interface, mais la fonction « do_nothing » est pas. Je ne comprends pas pourquoi? Y a-t-il un moyen de faire ce que j'essaie d'accomplir?

Répondre

0

Je devine que la méthode do_nothing est disponible , mais pas visible. Avez-vous essayé de l'appeler aveuglément?

Qu'est-ce que visible est ce qui est renvoyée par la méthode Introspect, qui à son tour dépend de l'attribut class _dbus_class_table, que vous devez donc mettre à jour pour avoir Introspect retourner la liste mise à jour des méthodes D-Bus.

0

func() n'a pas d'en-tête de service dbus, donc il n'est pas reconnu. Comment pouvez-vous définir "do_nothing" à votre fonction lorsque l'objet greg ne contient pas un tel attribut?

Vérifiez que l'objet possède l'attribut pour garantir la réussite de votre instruction.

print(hasattr(greg, "do_nothing")) 

En outre, il serait apprécié que vous pourriez accorder plus d'attention aux directives de style de code python dans le futur: http://www.python.org/dev/peps/pep-0008/

Questions connexes