在程序退出之前执行某些操作

在程序退出之前,你怎么能有一个函数或者一些东西被执行呢?我有一个脚本,将不断运行在后台,我需要它保存一些数据到文件退出之前。有什么标准的方法吗?

130874 次浏览

看看 atexit模块:

Http://docs.python.org/library/atexit.html

例如,如果我想在应用程序终止时打印消息:

import atexit


def exit_handler():
print 'My application is ending!'


atexit.register(exit_handler)

请注意,这对于脚本的正常终止非常有效,但是它不会在所有情况下都被调用(例如,致命的内部错误)。

如果通过引发 KeyboardInterrupt来停止脚本(例如,按 Ctrl-C) ,那么可以将其作为标准异常捕获。您也可以用同样的方法捕获 SystemExit

try:
...
except KeyboardInterrupt:
# clean up
raise

我提到这一点只是为了让您了解它; 做到这一点的“正确”方法是上面提到的 atexit模块。

如果您希望始终运行某些内容,即使是在错误情况下,也可以像这样使用 try: finally:-

def main():
try:
execute_app()
finally:
handle_cleanup()


if __name__=='__main__':
main()

如果还想处理异常,可以在 finally:之前插入一个 except:

如果你有类对象,它存在于程序的整个生命周期中,你也可以用 __del__(self)方法执行类的命令:

class x:
def __init__(self):
while True:
print ("running")
sleep(1)


def __del__(self):
print("destructuring")




a = x()

如果执行中止,这在正常的程序结束时也可以工作,当然也会有一些例外:

running
running
running
running
running
Traceback (most recent call last):
File "x.py", line 14, in <module>
a = x()
File "x.py", line 8, in __init__
sleep(1)
KeyboardInterrupt
destructuring

这是根据其他答案改编的版本。 它应该工作(没有完全测试)与优雅的退出,杀死和 PyCharm 停止按钮(最后一个我可以确认)。

import signal
import atexit




def handle_exit(*args):
try:
... do computation ...
except BaseException as exception:
... handle the exception ...




atexit.register(handle_exit)
signal.signal(signal.SIGTERM, handle_exit)
signal.signal(signal.SIGINT, handle_exit)