Python 程序退出处理器 (atexit)


Python 标准发行版中的 atexit 模块有两个函数 - register() 和 unregister()。这两个函数都接受一个现有的函数作为参数。注册的函数在解释器会话正常终止时自动执行。

如果注册了多个函数,则它们的执行顺序与注册顺序相反。这意味着,如果依次注册函数 f1()、f2() 和 f3(),则它们的执行顺序将是 f3()、f2() 和 f1()。

unregister() 函数从要自动调用的函数列表中删除指定的函数。

以下代码演示了如何在代码终止时注册一个函数以进行自动执行。(注意:此代码必须从命令行执行,而不是通过 IDLE 执行)。程序要求用户依次输入数字并将其相加。循环结束后,注册的函数 savetotal() 会自动被调用以将总和保存到文件中。

import atexit
sum = 0
def savetotal():
fo = open("atexit.txt","w")
fo.write(str(sum))
print ("sum written to file")
fo.close()
atexit.register(savetotal)
while True:
n = int(input("enter a number. -1 to exit"))
if n == -1:
break
sum = sum + n
print (sum)

将以上代码保存为 atexit-example.py 并从命令行运行。输入的连续数字会被加起来,并在最后将总和写入 atexit.txt 文件。

C:\python36>python atexit-example.py
enter a number. -1 to exit4
enter a number. -1 to exit6
enter a number. -1 to exit3
enter a number. -1 to exit5
enter a number. -1 to exit2
enter a number. -1 to exit-1
20
sum written to file

atexit.txt 文件将创建在当前目录中,并且它将存储总和(在本例中为 20)。

也可以使用不同的参数注册函数。在这种情况下,每个参数的函数将被独立注册,并按注册顺序的相反顺序执行。

import atexit
names = ['Ashok', 'Radha', 'Abdul', 'John']
def hello(name):
print ("Hello",name)
for name in names:
atexit.register(hello,name)

输出

C:\python36>python atexit-example2.py
Hello John
Hello Abdul
Hello Radha
Hello Ashok

atexit.unregister(hello) 将从函数列表中删除所有具有各种参数的 hello() 副本。

装饰器语法

注册函数的一种便捷替代方法是使用 register() 函数作为装饰器。

import atexit
@atexit.register
def hello():
print('Hello World!')
print('Say Hello')

输出

C:\python36>python atexit-example3.py
Say Hello
Hello World!

如果程序意外终止或调用了 os.exit() 函数,则注册的函数将不会自动调用。

atexit 模块可用于自动执行清理操作,例如关闭数据库和文件、释放资源等。

更新于: 2020-06-27

576 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告