2012-06-07 6 views
2

J'ai lu des rubriques relatives à la création dynamique de méthodes python, et j'ai suivi leurs instructions, mais cela ne fonctionne pas. Je ne sais pas si c'est parce que j'utilise décorateur @ ou autre chose.Création dynamique d'un signal DBus en python

Le code est ici, très simple.

Lors de l'exécution de ce code, aucune erreur ne s'est produite, mais lorsque j'utilise D-feet (un outil pour vérifier les informations dbus), je n'ai pas pu trouver de nouveaux signaux que j'ai créés.

#!/usr/bin/python 

import dbus 
import dbus.service 
import dbus.glib 
import gobject 
from dbus.mainloop.glib import DBusGMainLoop 

import psutil 

class EventServer(dbus.service.Object): 
    i = 0 

    @dbus.service.signal('com.github.bxshi.event') 
    def singal_example(self,msg): 
     """ example of singals 
     """ 
     print msg 

    def __init__(self): 
     bus_name = dbus.service.BusName('com.github.bxshi.event', bus=dbus.SessionBus()) 
     dbus.service.Object.__init__(self, bus_name, '/com/github/bxshi/event') 

    def create(self): 
     self.i +=1 
     setattr(self.__class__, 'signal_'+str(self.i), self.singal_example) 


if __name__ == "__main__": 
    DBusGMainLoop(set_as_default=True) 
    bus = dbus.SessionBus() 
    eventserver = EventServer() 
    gobject.timeout_add(1000,eventserver.create) 
    loop = gobject.MainLoop() 
    loop.run() 

Répondre

0
  1. vous avez une faute de frappe: singal_example au lieu de signal_example
  2. dans votre create -method vous appelez setattr la classe. Je ne sais pas ce que vous essayez de faire, mais vous devez simplement émettre le signal

Ceci est l'exemple fixe:

#!/usr/bin/python 

import dbus 
import dbus.service 
import dbus.glib 
import gobject 
from dbus.mainloop.glib import DBusGMainLoop 

#import psutil 

class EventServer(dbus.service.Object): 
    i = 0 

    @dbus.service.signal('com.github.bxshi.event') 
    def signal_example(self,msg): 
     """ example of singals 
     """ 
     print msg 

    def __init__(self): 
     bus_name = dbus.service.BusName('com.github.bxshi.event', bus=dbus.SessionBus()) 
     dbus.service.Object.__init__(self, bus_name, '/com/github/bxshi/event') 

    def create(self): 
     self.i +=1 
     #setattr(self.__class__, 'signal_'+str(self.i), self.singal_example) 
     self.signal_example('msg: %d' % self.i) 


if __name__ == "__main__": 
    DBusGMainLoop(set_as_default=True) 
    bus = dbus.SessionBus() 
    eventserver = EventServer() 
    gobject.timeout_add(1000,eventserver.create) 
    loop = gobject.MainLoop() 
    loop.run() 

Après cela, vous pouvez vous connecter au signal:

# ... 
bus = dbus.Bus() 
service=bus.get_object('com.github.bxshi.event', '/com/github/bxshi/event') 
service.connect_to_signal("signal_example", listener) 
# ... 
+1

Je ne veux pas émettre de signaux, La chose que je veux est de créer un nouveau signal à l'exécution. Je veux dire au début, je ne peux avoir qu'un seul signal, et après une demande vient d'un autre processus, je vais créer un nouveau signal pour cela. – bxshi