在 python 应用程序退出之前捕获它

Posted

技术标签:

【中文标题】在 python 应用程序退出之前捕获它【英文标题】:Catching a python app before it exits 【发布时间】:2011-02-01 21:16:03 【问题描述】:

我有一个 python 应用程序,它应该是非常长寿的,但有时这个过程就消失了,我不知道为什么。发生这种情况时没有任何记录,所以我有点茫然。

在代码中是否有某种方法可以连接到退出事件,或者是否有其他方法可以让我的一些代码在进程退出之前运行?我想记录内存结构的状态,以便更好地了解发生了什么。

【问题讨论】:

【参考方案1】:

atexit 发音为“退出时”。我第一次读到这个函数名时,我把它读作“一个 texit”,这 几乎 没有多大意义。

【讨论】:

情况可能会更糟;例如,模块作者可能在工作中度过了忙碌的一天,因此他们在事后为模块命名。 ;)【参考方案2】:

您可以尝试直接从控制台运行您的应用程序(windows 上的 cmd,unix 上的 sh/bash/etc),这样您就可以看到进程终止时打印到控制台的任何堆栈跟踪等。

【讨论】:

【参考方案3】:

我不确定您是否可以修改源代码,但如果可以,您可能想试试这个:

def debugexcept(type, value, tb):
    if hasattr(sys, 'ps1') or not (sys.stderr.isatty() and sys.stdin.isatty()) or type == SyntaxError:
        sys.__excepthook__(type, value, tb)
    else:
        import traceback, pdb
        traceback.print_exception(type, value, tb)
        print
        pdb.pm()


sys.excepthook = debugexcept

如果你从命令行启动你的 python 程序,你应该在它死掉时被转储到 python 调试器中,假设发生了一些“坏事”导致异常。我猜可能 stderr/stdout 已被捕获,而您没有看到异常?

即搜索类似的内容:

sys.stdout = open('stdout.log', 'w')
sys.stderr = open('stderr.log', 'w')

如果进程毫无例外地死亡,那么这可能更难找到。 Windows 上的一种(非常困难的方法)是使用诸如 windbg 之类的东西附加到进程并在 CRT 中的某个相关位置设置断点。

祝你好运!

【讨论】:

以上是关于在 python 应用程序退出之前捕获它的主要内容,如果未能解决你的问题,请参考以下文章

python 实现异常退出

在python中捕获Ctrl + C / SIGINT并优雅地退出多进程[重复]

python退出多重循环

在c ++中捕获shell脚本退出状态[重复]

从线程捕获异常时退出程序

如何在完成解析之前退出模块?