2

下面是用脚本编写的代码 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

4

1 回答 1

3

atexit函数在 Python 解释器退出时调用,而不是在脚本完成时调用。当您%run在 IPython 中执行某些操作时,解释器仍在运行,直到您退出 IPython。当你这样做时,你应该看到你的exit_function().

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

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

如果你真的需要让 atexit 函数运行,那么你可以调用atexit._run_exitfuncs. 但是,这是未记录的,它可能会做意想不到的事情,因为任何东西都可以注册 atexit 函数 - IPython 本身注册了六个,所以如果你在 IPython 中这样做,你可能会破坏事情。

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

于 2014-02-07T17:39:00.040 回答