如何断开 python DBus 连接?

Posted

技术标签:

【中文标题】如何断开 python DBus 连接?【英文标题】:How to Disconnect a python DBus connection? 【发布时间】:2012-09-09 13:46:07 【问题描述】:

我为 pidgin 客户端制作了某种应答机,它使用 Linuxes DBus 与 pidgin 建立连接。代码是这样的:

class DBus_Answer():
    def __init__(self, text = "No text"):  
        self.answer = text
        bus_loop = DBusQtMainLoop(set_as_default=True)
        self.bus = dbus.SessionBus()
        self.bus.add_signal_receiver(self.pidgin_control_func,
                                     dbus_interface="im.pidgin.purple.PurpleInterface",
                                     signal_name="ReceivedImMsg")

    def pidgin_control_func(self, account, sender, message, conversation, flags):
        obj = self.bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject")
        purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface")
        purple.PurpleConvImSend(purple.PurpleConvIm(conversation), self.answer)

现在我想将它用作另一个程序中的模块。我这样称呼它:

answering_machine.DBus_Answer(message)

问题是,当我停止第二个程序(将这个程序作为一个模块的程序)然后重新启动它时,我会得到一个segmentation fault,因为它想与 DBus 建立另一个连接并且它接缝不规则!

另外,我想给用户禁用这个模块的机会。我尝试使用if 声明。它将第一次工作。但是如果用户运行该模块一次,他就不能再禁用它了。

【问题讨论】:

如果您不发布一个独立的示例,则很难判断。您可以使用DBus_Answer 发布一个显示问题的小程序吗?为每个答案获取主​​循环似乎是错误的,您应该只有一个主循环。这可能是问题所在。 【参考方案1】:

发生分段错误是因为在 python 模块中(用 C 编写)指针为 NULL,或者因为它指向随机内存(可能从未初始化为任何东西),或者因为它指向已释放/解除分配的内存/"已删除”。所以你的问题可能与你的记忆有关。尝试使用here 描述的方法跟踪段错误

【讨论】:

以上是关于如何断开 python DBus 连接?的主要内容,如果未能解决你的问题,请参考以下文章

通过 Bluez DBus API 的设备连接/断开通知

dbus:冲洗连接?

如何使用 dbus 连接 HAL

使用 DBus 和 Bluez 将数据写入蓝牙设备

登录ubuntu之前如何在python守护进程中使用DBUS

如何使用 dbus/bluez 在 python 中获取当前 MTU