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

使用Ipython退出脚本时不调用atexit函数,ipython,atexit,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_函数 $python2.4 test_atexit.py I am in main function I am in

下面是用脚本编写的代码,比如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_函数

$python2.4 test_atexit.py  
I am in main function  
I am in exit function
当我使用ipython运行相同的函数时,则不会调用exit_函数

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

为什么在使用Ipython运行脚本时不调用exit_函数,以及如何使Ipython调用exit_函数

atexit
函数在Python解释器退出时调用,而不是在脚本完成时调用。当您
%在IPython中运行
某些内容时,解释器仍在运行,直到您退出IPython。执行此操作时,应该可以看到
exit_函数()的输出

您可能需要的是try/finally,它确保在try块之后运行finally代码,即使出现异常:

try:
    print("Doing things...")
    raise Exception("Something went wrong!")
finally:
    print("But this will still happen.")
如果确实需要运行atexit函数,那么可以调用
atexit.\u run\u exitfuncs
。然而,这是没有文档记录的,它可能会做一些意想不到的事情,因为任何东西都可以注册atexit函数——IPython本身注册了六个函数,所以如果在IPython中执行,很可能会破坏这些功能


(另外,Python 2.4?为了各地开发人员的理智,如果可以升级,请升级;-)

谢谢您的回复。我的要求是在ipython解释器的脚本末尾调用exit函数,而不是在ipython解释器的出口处。有什么方法可以调用相同的吗?try/finally可能就是你想要的。你知道如何将整个交互式IPython会话包装在try/finally中吗?@Flyte如果你想在退出IPython时运行某个程序,你可以执行原始问题尝试的操作,并使用@ThomasK Yes,但问题是IPython不会在退出时调用它。