当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第三方库


热门话题
带Maven的Eclipse Java存储库:缺少工件:compile   java如何以编程方式停止RMI服务器并通知所有客户端   java Roboguice抛出ClassNotFoundException:AnnotationDatabaseImpl   java为什么lucene 4.0删除IndexWriter类的两个构造函数?   nls如何避免java项目上不需要的日志消息?   测试无法在Selenium Webdriver(java)中定位iframe   使用XML的java servlet   java如何使用jxl用****屏蔽单元格   java使用SQLite从数据库中选择“没有这样的列”   导入扫描程序后出现java编译错误   插入查询的java空指针异常   使用创建PostgreSQL数据库。Java应用中的sql脚本   java使用jsoup将HTML解析为格式化的明文