2009-08-11 20 views
2

試圖在Eclipse的Eclipse + Pydev的:當按下「停止」,「

class Try: 
    def __init__(self): 
     pass 
    def __del__(self): 
     print 1 
a=Try() 
raw_input('waiting to finish') 

運行此文件,並沒有讓程序完成按下停止按鈕「清理」功能不叫不打印如果我嘗試從shell運行腳本並且執行ctrl-c \ sys.exit「1」確實會被打印,即del被調用 同樣的事情,如果我嘗試使用等待():

class A: 

    def __enter__(self): 
     return None 
    def __exit__(self, type, value, traceback): 
     print 3 


with A(): 
    print 1 
    raw_input('Waiting') 
    print 2 

如果我按下 「停止」 提示時, 「3」 未被打印

這是爲什麼? 有沒有辦法解決它?

謝謝,諾姆

回答

2

按下停止公然殺害解釋(雖然它實際上失敗相當頻繁)。像使用kill/taskkill一樣,該過程不知道它會消亡。維基百科

Ctrl+C片斷...

控制-C爲中止命令是 通過UNIX普及並且在其它 系統所採用。在POSIX系統中, 序列導致活動程序到 接收到一個SIGINT信號。如果 程序沒有指定如何處理 這個條件,它將被終止。 通常,處理 SIGINT的程序仍然會自行終止, 或至少終止其中運行 的任務。

Ctrl+C是一個控制信號中斷程序,但你可以在段落的中間已經注意到,程序可以指定如何處理信號。在Python中,通常會捕獲Ctrl + C throws a KeyboardInterrupt exception,然後Python會乾淨地退出。即使您使用Ctrl+C來扼殺口譯員,它也可以處理它,以便在退出之前清理環境。

我包含以下內容,因爲您問「有沒有辦法解決它?「

如果你想停止raw_input(...)電話時,可使用Ctrl+Z發送EOF。我環顧四周,而且似乎沒有辦法送在Eclipse Ctrl+C/0x03,很遺憾。

+0

謝謝,但我認爲你沒有回答我的問題 - 當從shell運行時,用ctrl-c停止* interpreter *仍然調用__del__,但是在eclipse中停止它時不會發生。 我不是在尋找一個解決方案,只是想知道是什麼導致了差異 – olamundo 2009-08-11 19:01:17

+0

我有點偏離,或至少解釋不好,所以我清理了一下,並添加了更多的信息。 – Zwergner 2009-08-12 01:32:31

+0

好的,謝謝 - 你的答案是現貨。起初我不明白。抱歉 – olamundo 2009-08-13 09:14:41

4

Python文檔:

__del__(self) 

當實例即將被破壞時調用。這也被稱爲析構函數。如果基類具有__del__()方法,則派生類的__del__()方法(如果有)必須顯式調用它以確保正確刪除實例的基類部分。請注意,__del__()方法有可能(儘管不推薦!)通過創建新的引用來推遲實例的銷燬。然後可能會在稍後刪除此新參考時調用它。 無法保證__del__()方法在解釋器退出時仍然存在的對象被調用。

如果你想保證一個方法被稱爲使用在Eclipse中with-statement

+0

也許我我錯過了一些東西,但我不確定這對我的情況是正確的: 我有A類,它擁有B類的實例,B擁有一些外部資源,它必須在退出時明確釋放。 我該如何解決這個問題與使用?使顯式方法稱爲close()同時用於A和B? – olamundo 2009-08-11 19:06:42

+0

此外,wait()在eclipse中不起作用比刪除更好 - 嘗試按停止,您會看到__exit__未被調用... – olamundo 2009-08-11 20:18:47

相關問題