2012-09-17 60 views
1

我爲pidgin客戶端做了一些應答機,它使用Linuxes DBus與pidgin進行連接。代碼是這樣的:如何斷開python DBus連接?

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聲明。它會第一次工作。但是如果用戶只運行一次模塊,他就不能再禁用它了。

+0

很難說如果你不發表一個獨立的例子。你可以使用'DBus_Answer'發佈一個小程序來展示問題嗎?爲每個答案獲得主循環似乎是錯誤的,你應該只有一個主循環。這可能是問題所在。 –

回答

1

由於在python模塊(用C編寫)中指針爲NULL,或者因爲它指向隨機存儲器(可能從未初始化爲任何內容),或者因爲它指向已釋放/釋放/ 「刪除」。因此你的問題可能與你的記憶。使用描述的方法跟蹤段錯誤here