使用Ipython退出脚本时不调用atexit函数

时间:2014-02-07 03:31:33

标签: ipython atexit

下面是用脚本写的代码,例如test_atexit.py

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 个答案:

答案 0 :(得分:1)

在Python解释器退出时调用

atexit函数,而不是在脚本完成时调用。当您在IPython中%run时,解释器仍在运行,直到您退出IPython。执行此操作时,您应该会看到exit_function()的输出。

你想要的是try / finally,这可以确保在try块之后运行finally代码,即使发生异常:

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?对于各地开发人员的理智,如果可以升级,请这样做;-))