当Python退出时运行代码的统一API
postscriptum的Python项目详细描述
警告
虽然代码被认为是功能性的,我在我的项目中使用了它, API还不完整,可能会在达到1.0之前更改。在
Postscriptum包装atexit.register、sys.excepthook和signal.signal来实现以下操作:
from postscriptum import PubSub ps = PubSub() # do this before creating a thread or a process @ps.on_finish() # don't forget the parenthesis ! def _(event): print("When the program finishes, no matter the reason.") @ps.on_terminate() def _(event): # event contains the signal that lead to termination print("When the user terminates the program. E.G: Ctrl + C, kill -9, etc.") @ps.on_crash() def _(event): # event contains the exception and traceback print("When there is an unhandled exception") ps.start()
所有这些函数将在适当的时候自动调用。即使调用了另一个处理程序,on_finish的处理程序也将被调用。在
安装
^{pr2}$- 覆盖率:100%
- 测试:Linux,但可以在Windows和Mac上运行
- 全类型提示
为什么要这么做?在
Python有3个非常不同的API来处理退出,它们都有各自的挑战:
- atexit:总是调用处理程序,不管python是否干净地退出,这可能导致重复调用。除非你得到一个SIGTERM信号,而它被悄悄地忽略了。即使whell打电话来,它也不提供任何关于退出原因的信息。在
- signal:要捕获终止信号,您需要知道要监视哪些信号(它们根据操作系统的不同而有所不同)。正常的行为是退出,但是如果您设置了处理程序,程序将不会退出,除非您调用系统出口(). 而且,每个信号只能有一个处理程序。最后,在处理程序中使用I/O时会遇到一些问题。在
- 系统例外对所有异常调用,但不调用SystemExit。如果不正确调用前一个钩子,也会导致调试错误。你只能有一个处理程序。在
而且,没有自动的方式来对sys.exit()作出反应。而且无法区分SystemExit和{tt5}$,这是信号所需的。在
Postscriptum还没有处理最后一个目标:
- 信号由childs捕获并传递给主线程,但不传递给异常。在
- 处理程序出错可能会导致您根本没有错误消息。在
- 项目
标签: