当Python退出时运行代码的统一API

postscriptum的Python项目详细描述


警告

虽然代码被认为是功能性的,我在我的项目中使用了它, API还不完整,可能会在达到1.0之前更改。在

Postscriptum包装atexit.registersys.excepthooksignal.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捕获并传递给主线程,但不传递给异常。在
  • 处理程序出错可能会导致您根本没有错误消息。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
tomcat Java条带错误   java OPENTSDB fsck修复程序不更正重复点   java JavaFX在控制器内切换自身的可见性   java maven surefire插件未并行执行运行程序   读取导致Freemarker模板引擎中TemplateException的Java对象   无法使Java库与我的Android应用程序一起工作   安卓 java。lang.IllegalStateException游标   使用Java检索XML文件中的XSL URL和名称   java如何从文本文件集合中提取特定值   电子邮件java mail gmail   java为什么finalize()只被垃圾收集器调用一次?   java方法findViewById(int)对于Json类型是未定义的。蛇形   java在安卓中尝试从brother打印机打印位图时遇到以下异常   java在颤振中支持Kotlin的优势   java从后面编写文本   java制作列表。第一个列表可以有相同的数字,第二个将是价格,尝试制作第三个列表,如果它们是相同的数字,它将添加价格