python-dbusとcherrypyを使用してUSBデバイスを監視し、挿入されたUSBデバイスのステータスを維持するRESTサービスを提供しています。私はこれらのサービスを個別に作成およびデバッグしましたが、期待どおりに機能します。
今、私はサービスを単一のアプリケーションにマージしています。私の問題は、両方のサービス(cherrypyとdbus)を一緒に開始できないようです。いずれかがブロックするか、スコープ外になるか、初期化されません。
それぞれを独自のスレッドにカプセル化してみましたが、それらに対してstartを呼び出すだけです。これにはいくつかの奇妙な問題があります。
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
このコードを実行すると、cherrypyコードは完全には初期化されません。USBデバイスが挿入されると、cherrypyは初期化を続行します(スレッドが何らかの形でリンクされているかのように)が、機能しません(データを提供せず、ポートで接続さえしません)cherrypys wikiページを見ましたが、起動して戻るような方法でcherrypyを起動する方法が見つからなかったので、DBusのものを初期化して、これをドアから出すことができます。
私の最終的な質問は、cherrypyを開始し、ブロックせずに作業を継続する方法はありますか?この例のスレッドを削除し、メインスレッドでcherrypyとdbusの両方を初期化します。