使用IPython退出脚本时,atexit函数未被调用

3
以下是在一个名为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个回答

4

atexit函数在Python解释器退出时调用,而不是在您的脚本完成时调用。当您在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本身注册了半打,因此如果在IPython中执行此操作,很可能会导致问题。

(另外,Python 2.4?为了开发人员的理智,请尽可能升级;-))


谢谢您的回复,Thomas。我的要求是在ipython脚本结束时调用一个退出函数,而不是在Ipython解释器退出时调用。有没有办法实现这个要求? - viky
一个try/finally可能是你想要的。 - Thomas K
@Flyte 如果你想要在退出IPython时运行某些东西,你可以像原始问题所尝试的那样使用atexit - Thomas K
@ThomasK 是的,但问题在于IPython不会在退出时调用它。 - Ellis Percival
@ThomasK 不,我试图使用atexit关闭串口,因为否则它会在退出时挂起。但是使用atexit并没有起作用,所以我猜它在IPython调用atexit函数之前就挂起了。没关系,我会在每个会话结束时写上s.close() :) - Ellis Percival
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接