如何注册一个只在Python程序退出时调用的函数?

2024-10-06 07:41:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在Python程序完成时运行任务,但前提是它成功完成。据我所知,使用atexit模块意味着无论成功与否,我注册的函数将始终在程序终止时运行。是否有类似的功能来注册一个函数,以便它只在成功退出时运行?或者,我的退出功能有没有办法检测退出是正常的还是异常的?在

下面是一些代码来演示这个问题。它将打印出程序成功的消息,即使它失败了。在

import atexit

def myexitfunc():
    print "Program succeeded!"

atexit.register(myexitfunc)

raise Exception("Program failed!")

输出:

^{pr2}$

Tags: 模块函数代码import程序功能消息def
2条回答

开箱即用,atexit不太适合您想做的事情:它主要用于在最后一刻清理资源,因为程序正在关闭并退出。以此类推,它是try/except的“finally”,而您想要的是try/except的“else”。在

我能想到的最简单的方法是继续创建一个全局标志,只有当脚本“成功”时才设置它。。。然后让所有附加到atexit的函数检查该标志,除非设置了它,否则什么都不做。在

例如:

_success = False
def atsuccess(func, *args, **kwds):
    def wrapper():
        if _success:
            func(*args,**kwds)
    atexit(wrapper)

def set_success():
    global _success
    _success = True

# then call atsuccess() to attach your callbacks,
# and call set_success() before your script returns

一个限制是,如果有任何代码在设置成功标志之前调用sys.exit(0)。这样的代码应该(可能)被重构以首先返回到主函数,这样您就只在一个地方调用set_success和{}。否则,需要在脚本的主入口点周围添加类似以下包装器的内容:

^{pr2}$

with语句中包装程序的主体,并定义一个相应的上下文对象,该对象仅在未引发异常时执行操作。比如:

class AtExit(object):
    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        if exc_value is None:
            print "Success!"
        else:
            print "Failure!"

if __name__ == "__main__":
        with AtExit():
            print "Running"
#            raise Exception("Error")

相关问题 更多 >