¿Cómo se exponen los métodos y las propiedades en DBus utilizando un QDBusAbstractAdaptor con PyQt4?

Estoy tratando de ejecutar un código básico en DBus usando PyQt4, específicamente QtDBus. Estoy usando una versión Python3 de PyQt4. Ya obtuve el código que quiero que se ejecute en Qt (c ++), pero quiero que se ejecute un código similar utilizando solo Python. Quiero exponer Métodos, señales / ranuras y propiedades en DBus para que otro código Python pueda llamar.

En Qt, se utiliza la macro / función Q_CLASSINFO para realizar la introspección de DBus. Si bien he introducido el método Q_CLASSINFO, no puedo lograr que produzca el mismo tipo de funcionalidad. Por lo que sé, no hay documentación sobre el método Q_CLASSINFO, por lo que no estoy seguro de que exista otra forma. Al usar D-Feet puedo ver claramente que no hay métodos expuestos automáticamente, así que estoy un poco atascado.

Esto es lo que tengo hasta ahora.

from PyQt4 import QtDBus
from PyQt4.QtCore import QCoreApplication, QObject, Q_CLASSINFO, pyqtSlot, pyqtProperty
from PyQt4.QtDBus import QDBusConnection, QDBusAbstractAdaptor

SERVICE = 'com.home.dbus'

class MyServer(QObject):


    def __init__(self):
        QObject.__init__(self)
        self.__dbusAdaptor = ServerAdaptor(self)

    def close(self):
        pass

    def echo(self, value):
        echoed = 'Received {0}'.format(value)
        return echoed

    def name(self):
        return 'myname'

    def dbus_adaptor(self):
        return self.__dbusAdaptor

class ServerAdaptor(QDBusAbstractAdaptor):
    """ This provides the DBus adaptor to the outside world"""

    def __init__(self, parent):
        super().__init__(parent)
        self.__parent = parent
        Q_CLASSINFO("D-Bus Introspection",
        "  <interface name=\"com.home.dbus\">\n"
        "    <method name=\"name\">\n"
        "      <arg direction=\"out\" type=\"s\" name=\"name\"/>\n"
        "    </method>\n"
        "    <method name=\"echo\">\n"
        "      <arg direction=\"in\" type=\"s\" name=\"phrase\"/>\n"
        "      <arg directory=\"out\" type=\"s\" name=\"echoed\"/>\n"
        "    </method>\n"
        "  </interface>\n")

    def close(self):
        parent.close()

    def echo(self, value):
        return parent.echo(value)

    def name(self):
        return parent.name

def start():
    app = QCoreApplication([])
    if QDBusConnection.sessionBus().isConnected() == False:
        print('Cannot connect to D-Bus session bus')
        return
    print('Starting')
    server = MyServer()
    if not QDBusConnection.sessionBus().registerService(SERVICE):
        print('Unable to register service name')
        return
    if not QDBusConnection.sessionBus().registerObject('/mydbus', server.dbus_adaptor):
        print('Unable to register object at service path')
        return
    app.exec();
    print('Exited')

if __name__ == '__main__':
    start()

Si bien me gusta mucho usar QtDBus en C ++ debido a cómo quiero estructurar este gran proyecto mío, realmente necesito que el objeto al que se accede a través de DBus se escriba en Python3.

Respuestas a la pregunta(1)

Su respuesta a la pregunta