2013-03-20 145 views
3

我有一個全局實例,我希望在Python解釋器退出時銷燬它(調用函數__del__)。我是否期待太多的Python解釋器? 我的測試方法是在__del__函數中打印,從命令行運行python.exe,然後按Ctrl/Break。此時,我希望在命令行窗口中看到打印內容。但是,我沒有。Python:全局對象銷燬

+0

好的,我已經注意到用Ctrl/Break(__del__未調用)和Ctrl/C(__del__調用)終止Python解釋器的區別。因此,我假設Ctrl/Break殺死進程,而Ctrl/C正確結束。那麼關閉窗戶我應該期待什麼呢? (也許這個問題應該在不同的論壇上提出)。 – 2013-03-20 23:30:18

+0

也感興趣:http://stackoverflow.com/q/14628486/748858 – mgilson 2013-03-20 23:41:43

+1

另一個原因,你不應該'__del__':http://stackoverflow.com/a/14323849/748858 – mgilson 2013-03-20 23:45:29

回答

6

是的,你期待太多。 Python的doesn't make any guarantees有關調用__del__

它不能保證__del__()方法要求仍然存在時解釋退出的對象。

編輯:

一般來說,你應該避免使用__del__。對於大多數情況,上下文管理者更好對於極少數情況,當您需要確保在解釋器退出時清除某些外部(即從C代碼分配的)資源時,可以使用atexit module

+0

我的目標是在可執行實例(包含內存中的全局對象)終止之前將當前狀態保存到數據庫中。在析構函數中執行數據庫操作在概念上是錯誤的嗎? – 2013-03-20 23:37:17

3

您可以爲signal.SIGBREAK信號添加處理程序。那會讓你攔截ctrl + break。表格the documentation

import signal, os 

def handler(signum, frame): 
    print 'Someone is trying to exit!', signum 

signal.signal(signal.SIGBREAK, handler) 
+0

這句柄關閉窗戶呢? – 2013-03-20 23:33:04

+0

編號@Lqc的回答更合適 – 2013-03-20 23:34:04

+0

非常感謝! – 2013-03-20 23:39:05