J'utilise python-dbus et cherrypy pour surveiller les périphériques USB et fournir un service REST qui conservera l'état sur les périphériques USB insérés. J'ai écrit et débogué ces services indépendamment, et ils fonctionnent comme prévu.Numéro de fusion DBus-Cherrypy
Maintenant, je fusionne les services en une seule application. Mon problème est: Je n'arrive pas à obtenir les deux services (cherrypy et dbus) pour commencer ensemble. L'un ou l'autre bloque ou sort de la portée, ou n'est pas initialisé.
J'ai essayé d'encapsuler chacun dans son propre thread, et il suffit d'appeler start sur eux. Cela a des problèmes bizarres.
class RESTThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
cherrypy.config.update({ 'server.socket_host': HVR_Common.DBUS_SERVER_ADDR, 'server.socket_port': HVR_Common.DBUS_SERVER_PORT, })
cherrypy.quickstart(USBRest())
class DBUSThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
DBusGMainLoop(set_as_default=True)
loop = gobject.MainLoop()
DeviceAddedListener()
print 'Starting DBus'
loop.run()
print 'DBus Python Started'
if __name__ == '__main__':
# Start up REST
print 'Starting REST'
rs = RESTThread()
rs.start()
db = DBUSThread()
db.start()
#cherrypy.config.update({ 'server.socket_host': HVR_Common.DBUS_SERVER_ADDR, 'server.socket_port': HVR_Common.DBUS_SERVER_PORT, })
#cherrypy.quickstart(USBRest())
while True:
x = 1
Lorsque ce code est exécuté, le code Cherrypy n'est pas entièrement initialisé. Quand un périphérique USB est inséré, cherrypy continue à s'initialiser (comme si les threads sont liés d'une façon ou d'une autre), mais ne fonctionne pas (ne sert pas de données ou même de faire des connexions sur le port) Je n'ai pas trouvé un moyen de démarrer cherrypy de telle sorte qu'il inits, et retourne, afin que je puisse initier les choses DBus et être en mesure de faire sortir la porte.
Ma question ultime est: Y a-t-il un moyen de démarrer et de ne pas bloquer Cherrypy mais de continuer à travailler? Je veux me débarrasser des threads dans cet exemple et init à la fois cherrypy et dbus dans le fil principal.
J'ai essayé ceci: http://stackoverflow.com/questions/510821/how-to-write-a-functional-test-for-a-dbus-service-written-in-python/762079#762079 Maintenant cherrypy fonctionne très bien, mais le loop.run() ne semble pas fonctionner. – Therealstubot