当前位置: 首页 > 面试题库 >

如何找到退出代码或在Python中调用atexit回调时的原因?

单嘉泽
2023-03-14
问题内容

我想知道Python脚本是否正确终止。为此,我正在使用,atexit但是问题是我不知道如何区分是使用sys.exit(0)还是非零或异常调用atexit。

推理:如果程序正常结束,它将什么都不做,但是如果程序由于异常结束或返回不同于零的错误代码(退出状态)而结束,则我想触发某些操作。

如果您想知道为什么我不使用try /
finally是因为我想为导入通用模块的许多脚本添加相同的行为。我不想修改所有这些,而是​​要向正在导入的模块添加atexit()hack,并在所有这些代码中免费获得此行为。


问题答案:

您可以使用sys.excepthook和通过猴子补丁来解决此问题sys.exit()

import atexit
import sys

class ExitHooks(object):
    def __init__(self):
        self.exit_code = None
        self.exception = None

    def hook(self):
        self._orig_exit = sys.exit
        sys.exit = self.exit
        sys.excepthook = self.exc_handler

    def exit(self, code=0):
        self.exit_code = code
        self._orig_exit(code)

    def exc_handler(self, exc_type, exc, *args):
        self.exception = exc

hooks = ExitHooks()
hooks.hook()

def foo():
    if hooks.exit_code is not None:
        print("death by sys.exit(%d)" % hooks.exit_code)
    elif hooks.exception is not None:
        print("death by exception: %s" % hooks.exception)
    else:
        print("natural death")
atexit.register(foo)

# test
sys.exit(1)


 类似资料:
  • 注册退出回调 # atexit_simple.py import atexit def all_done(): print('all_done()') print('Registering') atexit.register(all_done) print('Registered') # atexit_multiple.py import atexit def my_clea

  • 问题内容: 我目前正在使用 我对Python相当陌生,但是它“感觉”到应该有一些api可以让我做类似的事情: 我这样做是为了在知道cmd已经退出的情况下可以执行某些操作(例如,对当前正在运行的外部进程数进行计数) 我以为我可以将子流程包装在将线程与方法结合在一起的类中,但是由于我还没有在Python中完成线程,而且对于API来说这似乎很常见,我想我会尝试先找到一个。 提前致谢 :) 问题答案: 您

  • 问题内容: 我有这样的代码: 我的问题是,节点在运行时立即终止。它显示“ Icanhasclient”,但没有调用回调内的console.log。 (本例中的mysql是node- mysql 。 有什么办法可以使node.js在退出之前等待回调完成? 问题答案: 回调未排队 节点运行直到所有事件 队列 都为空。诸如以下的调用时,回调将添加到事件 队列 中 已执行。该调用是模块开发人员编写的代码的

  • 问题内容: 我试图用一个,但不幸的是它似乎并没有工作时。这是一些示例代码: 此代码的输出是: 我希望可以在和被调用时调用,并且输出将类似于(强调)!: 为什么这不起作用,并且当a终止时是否有更好的方法(从上下文)记录消息? 感谢您的输入-非常感谢。 编辑: 根据亚历克斯·马特利(Alex Martelli)建议的解决方案,以下工作可预期进行: 值得在文档中注意以下注释: 注意:当程序被信号杀死,检

  • 问题内容: 我想知道如何轻松单击(或使用一些简单的快捷方式)函数名称并找到其所有被调用者或打开已定义的位置。Web中的大多数Web手册确实很难遵循或无法制定。说我想单击并查看它的定义位置? 问题答案: 为此,Vim与 cscope 工具集成在一起。请参阅参考资料。