2014-02-07 65 views
1

腳本時下面是寫在一個腳本代碼說test_atexit.py的atexit函數不叫退出使用IPython的

def exit_function(): 
    print "I am in exit function" 
import atexit 
atexit.register(exit_function) 
print "I am in main function" 

當我使用的python2.4則是被稱爲exit_function運行功能

$python2.4 test_atexit.py 
I am in main function 
I am in exit function 

當我使用IPython的那麼exit_function不會被調用

$ ipython 
In [1]: %run test_atexit.py 
I am in main function 
In [2]: 

爲什麼運行相同的使用Ipython運行腳本時不調用exit_function,如何使ipython調用exit_function

回答

1

atexit函數在Python解釋器退出時調用,而不是腳本完成時調用。當你在IPython中使用%run時,解釋器仍在運行,直到你退出IPython。當你這樣做時,你應該看到你的輸出exit_function()

也許你想要的是一個try /終於,這確保了最終代碼try塊後運行,即使發生異常:

try: 
    print("Doing things...") 
    raise Exception("Something went wrong!") 
finally: 
    print("But this will still happen.") 

如果你真的需要做的atexit功能運行,那麼你可以撥打atexit._run_exitfuncs。然而,這是沒有記錄的,它可能會做一些意想不到的事情,因爲任何事情都可以註冊atexit函數--IPython本身會註冊6個,所以如果你在IPython中執行,你可能會破壞一些東西。

(另外,Python的2.4?對於開發者的理智無處不在,如果有可能升級,這樣做;-))

+0

感謝您的答覆托馬斯。我的要求是在ipython腳本的末尾調用一個退出函數,而不是在Ipython解釋器的出口處。有沒有可以調用相同的東西? – viky

+0

嘗試/終於可能是你在追求什麼。 –

+0

你知道一種方法來試試/最後包裝你的整個交互式IPython會話嗎? –