我正在尝试连接到两个单独的D-Bus服务,但是我只能连接到一个。尽管(通过provider2API.service()报告)第二个连接已连接到第二个服务,但第二个连接仍仅连接到第一个服务。
下面的最小复制设置了两个d-bus服务,然后连接并查询这两个服务。
此复制品已在运行Python 3.7的Debian 7上进行了测试,并导入了驱动Qt 5.11.1的PyQt 5.11.2。它可以在几乎满足这些要求的任何Linux系统上工作。
import sys, signal
from PyQt5.QtCore import pyqtSlot, QObject, QCoreApplication
from PyQt5.QtDBus import QDBusConnection, QDBusInterface, QDBusReply
signal.signal(signal.SIGINT, signal.SIG_DFL) #Quit on ctrl-c.
#First, set up two D-Bus providers.
QDBusConnection.systemBus().registerService(
'com.krontech.chronos.control.mock' )
QDBusConnection.systemBus().registerService(
'com.krontech.chronos.video.mock' )
class Provider1(QObject):
@pyqtSlot(result=str)
def exampleCall(self):
return 'I am #1.'
class Provider2(QObject):
@pyqtSlot(result=str)
def exampleCall(self):
return 'I am #2.' #ERROR: This is never called.
provider1 = Provider1()
QDBusConnection.systemBus().registerObject('/', provider1,
QDBusConnection.ExportAllSlots )
provider2 = Provider2()
QDBusConnection.systemBus().registerObject('/', provider2,
QDBusConnection.ExportAllSlots )
provider1API = QDBusInterface('com.krontech.chronos.control.mock', '/', '',
QDBusConnection.systemBus() )
provider2API = QDBusInterface('com.krontech.chronos.video.mock', '/', '',
QDBusConnection.systemBus() )
#Second, call both D-Bus providers.
#Only one provider is actually called.
app = QCoreApplication(sys.argv)
result1 = QDBusReply(provider1API.call('exampleCall')).value()
result2 = QDBusReply(provider2API.call('exampleCall')).value()
service1 = provider1API.service()
service2 = provider2API.service()
print(f"Provider1: '{result1}' on {service1}")
print(f"Provider2: '{result2}' on {service2}") #ERROR: Prints 'I am #1.'
sys.exit(app.exec_())
输出:
Provider1: 'I am #1.' on com.krontech.chronos.control.mock
Provider2: 'I am #1.' on com.krontech.chronos.video.mock
输出应为:
Provider1: 'I am #1.' on com.krontech.chronos.control.mock
Provider2: 'I am #2.' on com.krontech.chronos.video.mock
(请注意提供商2现在如何声称“我是#2”。)
谢谢!
注意:要允许您的系统连接到D-Bus,您需要将https://github.com/krontech/chronos-gui-2/blob/bf7dd5fe82eb5636e97ea02f8f0e5d0075318f6d/util/com.krontech.chronos.conf放在/etc/dbus-1/system.d/com.krontech.chronos.conf
中。如果您不是以root身份运行,则应在.conf文件中将您自己的用户名替换为root。
答案 0 :(得分:0)
结果我需要为不同的接口指定不同的路径(上面的'/'
)。将一个设置为/control
,将一个设置为/video
解决了该问题。
我要成为木匠。伍德抱怨少,燃烧更好。