web-dev-qa-db-fra.com

Comment utiliser DBus pour créer un client et un serveur sans fichiers de configuration dbus sur les dernières versions d'Ubuntu?

Je souhaite utiliser un pont entre un flask webapp et un python sous-processus sous python3. Je ne pouvais pas trouver un exemple de service capable de copier-coller d'un service instancié sans fichiers de configuration pour les mêmes.

La raison de vouloir faire cela est que je puisse avoir plusieurs threads/processus et utiliser un seul processus Dbus en tant que courtier de session entre instances d'instance pour conserver l'état du jeu.

Tous les exemples Dbus triviaux que j'ai trouvés ne comprenaient que des démos python2.x ou d'anciennes versions du véhicule mainloop de votre choix.

3
RobotHumans

Cet exemple nécessite:

python3-dbus.mainloop.pyqt5, python3-dbus

Exemple de serveur:

import signal, sys
signal.signal(signal.SIGINT, signal.SIG_DFL)

from PyQt5.QtCore import *
import math
import dbus
import dbus.service
from dbus.mainloop.pyqt5 import DBusQtMainLoop

class Server(dbus.service.Object):
  def __init__(self):
    busName = dbus.service.BusName('org.documentroot.Fisticuffs', bus = dbus.SessionBus())
    dbus.service.Object.__init__(self, busName, '/Fisticuffs')
    #Insert subprocesses here...

  @dbus.service.method('org.documentroot.Fisticuffs', in_signature = 's', out_signature = 's')
  def move(self, a): return "Move recieved"
  @dbus.service.method('org.documentroot.Fisticuffs', in_signature = 'dd', out_signature = 'd')
  def add(self, a, b): return a+b

DBusQtMainLoop(set_as_default = True)
app = QCoreApplication(sys.argv)
server = Server()
app.exec_()  

Exemple de client:

import dbus

bus = dbus.SessionBus()
server = bus.get_object('org.documentroot.Fisticuffs', '/Fisticuffs')
print('5 and 10 are:')
print(server.add(5, 10, dbus_interface = 'org.documentroot.Fisticuffs'))

Crédits:
Adapté de ici pour que pyqt5 écoute Ctl+C
and here pour mettre à jour un tutoriel sur la façon de faire fonctionner un serveur dbus-python dans le boucle principale PyQt5 sur python3.

3
RobotHumans