擅长:python、mysql、java
<p>开箱即用,<code>atexit</code>不太适合您想做的事情:它主要用于在最后一刻清理资源,因为程序正在关闭并退出。以此类推,它是try/except的“finally”,而您想要的是try/except的“else”。在</p>
<p>我能想到的最简单的方法是继续创建一个全局标志,只有当脚本“成功”时才设置它。。。然后让所有附加到<code>atexit</code>的函数检查该标志,除非设置了它,否则什么都不做。在</p>
<p>例如:</p>
<pre><code>_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
</code></pre>
<p>一个限制是,如果有任何代码在设置成功标志之前调用<code>sys.exit(0)</code>。这样的代码应该(可能)被重构以首先返回到主函数,这样您就只在一个地方调用<code>set_success</code>和{<cd5>}。否则,需要在脚本的主入口点周围添加类似以下包装器的内容:</p>
^{pr2}$