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模块可用于自动执行清除操作,例如关闭数据库和文件,释放资源等。