在 PyDbus 模拟中使用私有 DBus 连接

Posted

技术标签:

【中文标题】在 PyDbus 模拟中使用私有 DBus 连接【英文标题】:Using private DBus connection in PyDbus mocks 【发布时间】:2021-10-20 01:10:06 【问题描述】:

有一个服务(在第二个列表中给出了 DBus“坐标”) 在 Linux 环境中运行,同时 我在测试中正在运行一个自定义私有 DBus,如下所示 夹具:

def run_custom_daemon():
    cmd = [
        "dbus-daemon",
        "--system",
        "--nofork",
        "--address=unix:path=<some_path>.sock"
    ]
    proc = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=False)
    os.environ['CUSTOM_DBUS_SYSTEM_BUS_ADDRESS'] = "<some_path>.sock"
    time.sleep(0.5)
    yield proc
    proc.kill()

现在,我的组件使用服务com.foo.bar.Baz 并在 C++ 代码中 我使用 sdbus-c++ 例如

m_prx = stdbus::createProxy(...)

现在,如果我按原样运行测试,似乎是因为“官方” DBus 在某种程度上被测试“屏蔽”了,我得到了一个ServiceNotKnown 错误。但是,如果我使用下面的代码模拟服务, 我得到“名称已经拥有所有者”类型的错误。 问题可能是如何告诉模拟使用 上述“私人”设置的DBus?

from pydbus import SystemBus
from gi.repository import GLib

class MockSrv:
    dbus = """
        <node name="/com/foo/bar/Baz">
            <interface name="com.foo.bar.Baz">
                <method name="Buzz">
                    <arg type="s" direction="out"/>
                </method>
            </interface>
        </node>
    """

mloop = GLib.MainLoop()
mbus = SystemBus()
srv = MockSrv()
mbus.publish("com.foo.bar.Baz",
            ("/com/foo/bar/Baz", srv)
            )
mloop.run()

【问题讨论】:

【参考方案1】:

如果我的理解正确,您想使用 Python 模拟 DBus 服务,然后使用 C++ 连接到该服务进行测试。

我发现最好的方法是创建一个本地会话总线(使用类似dbus-run-session)来运行应用程序。这将正确设置环境变量以打开新的 SESSION 总线,然后在最后退出。

【讨论】:

以上是关于在 PyDbus 模拟中使用私有 DBus 连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有桌面环境的 CentOS 中使用 dbus

无法从 ubuntu 中的服务连接到会话 dbus

dbus会话连接:用qt槽连接dbus信号,怎么做?

Qt DBus 连接不使用 SLOT 参数中的 typedef

这个 Qt DBus 信号连接代码是不是正确?

基于 DBusGProxy 连接 dbus 信号失败