Python中的多个D-Bus会话总线对象

1 投票
2 回答
2300 浏览
提问于 2025-04-16 04:29

我写了一个脚本,可以连接到远程计算机上的d-bus会话总线,代码如下:

os.environ["DBUS_SESSION_BUS_ADDRESS"] = "tcp:host=192.168.0.1,port=1234"
bus = dbus.SessionBus()

这个方法运行得很好,但现在我需要能够连接到不同计算机上的多个会话总线。我尝试了以下方法:

os.environ["DBUS_SESSION_BUS_ADDRESS"] = "tcp:host=192.168.0.1,port=1234"
bus1 = dbus.SessionBus()
os.environ["DBUS_SESSION_BUS_ADDRESS"] = "tcp:host=192.168.0.2,port=1234"
bus2 = dbus.SessionBus()

但是这并没有成功。第二次调用SessionBus时,返回的对象和第一次调用的是一样的。也就是说,在这个例子中,这两个对象都指向192.168.0.1上的会话总线。看起来只有第一次调用SessionBus时真的有作用,之后的调用都只是返回第一次创建的那个对象。有没有人知道怎么解决这个问题?

2 个回答

1

在查看Python和DBUS的源代码时,我发现_dbus.py文件里,SessionBus.__new__这个方法有一个叫private的布尔参数,也就是一个可以是真或假的选项。

`private` : bool
    If true, never return an existing shared instance, but instead
    return a private connection.

那么,使用bus = dbus.SessionBus(private=True)这个写法有什么不同吗?

3

回头看,这个问题有点让人困惑。其实,session bus、system bus和其他的d-bus之间没有本质上的区别。如果你想在某个特定地址连接到一个总线,只需要使用 dbus.bus.BusConnection 就可以了。

bus1 = dbus.bus.BusConnection("tcp:host=192.168.0.1,port=1234")
bus2 = dbus.bus.BusConnection("tcp:host=192.168.0.2,port=1234")

撰写回答