在程序退出之前,你怎么能有一个函数或者一些东西被执行呢?我有一个脚本,将不断运行在后台,我需要它保存一些数据到文件退出之前。有什么标准的方法吗?
看看 atexit模块:
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。
KeyboardInterrupt
SystemExit
try: ... except KeyboardInterrupt: # clean up raise
我提到这一点只是为了让您了解它; 做到这一点的“正确”方法是上面提到的 atexit模块。
如果您希望始终运行某些内容,即使是在错误情况下,也可以像这样使用 try: finally:-
try: finally:
def main(): try: execute_app() finally: handle_cleanup() if __name__=='__main__': main()
如果还想处理异常,可以在 finally:之前插入一个 except:
finally:
except:
如果你有类对象,它存在于程序的整个生命周期中,你也可以用 __del__(self)方法执行类的命令:
__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)