PyQt4、特に QtDBus を使用して、DBus で基本的なコードを実行しようとしています。PyQt4 の Python3 バージョンを使用しています。Qt (c++) で実行したいコードを既に取得していますが、Python のみを使用して同様のコードを実行したいと考えています。他の Python コードを呼び出せるように、メソッド、シグナル/スロット、およびプロパティを DBus に公開したいと考えています。
Qt では、Q_CLASSINFO マクロ/関数を使用して DBus イントロスペクションを行います。Q_CLASSINFO メソッドを取得しましたが、同じタイプの機能を生成することができません。私が知る限り、Q_CLASSINFO メソッドに関するドキュメントはまったくないため、別の方法があるかどうかはわかりません。D-Feetを使用すると、自動的に公開されるメソッドがないことがはっきりとわかるので、ちょっと行き詰まっています。
これが私がこれまでに持っているものです。
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()
私のこの大規模なプロジェクトをどのように構築したいかという理由で、C++ で QtDBus を使用するのが本当に好きですが、DBus 経由でアクセスするオブジェクトを Python3 で作成する必要があります。