Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使atexit注册函数根据退出状态动作_Python_Python 2.7 - Fatal编程技术网

Python 使atexit注册函数根据退出状态动作

Python 使atexit注册函数根据退出状态动作,python,python-2.7,Python,Python 2.7,在上面的代码中,再见每次退出时都会执行。我可以根据退出状态打印不同的消息吗?类似于如果退出状态为1,则打印致命:再见 我也检查了sys.exitfunc,但这似乎也不支持这一点?这不是应该得到支持的基本功能吗?或者对于这样的情况,是否有更好的功能可以使用。使用包装器函数退出我的程序是唯一的方法吗?你可以很容易地使用monkey patchsys.exit: import atexit import sys @atexit.register def goodbye(): print "

在上面的代码中,
再见
每次退出时都会执行。我可以根据退出状态打印不同的消息吗?类似于如果退出状态为1,则打印
致命:再见


我也检查了
sys.exitfunc
,但这似乎也不支持这一点?这不是应该得到支持的基本功能吗?或者对于这样的情况,是否有更好的功能可以使用。使用包装器函数退出我的程序是唯一的方法吗?

你可以很容易地使用monkey patch
sys.exit

import atexit
import sys 

@atexit.register
def goodbye():
    print "Good Bye"

print "Hello World"
#sys.exit(0) or sys.exit(1)
当然,只有在实际从代码中的某个地方调用了
sys.exit
时,才会运行此命令

您也可以将主函数包装为try/except:

>>> import sys
>>> sys.my_exit = sys.exit
>>> def func(status):
...     if status:
...        print "Fatal!"
...     sys.my_exit(status)
... 
>>> sys.exit = func
>>> sys.exit(1)
Fatal!

基本上,我需要两条单独的消息“runfinishedsyccessfully”和“Aborted”。因此,在这段代码中,如果不实际调用sys.exit(0),就无法打印“Run finished successfully”。@shadyabhi——我们需要测试用户放入
sys.exit(0)
——这仍然会引发
SystemExit
,如果我们没有显式执行,就不会打印
“success”
。最终,这似乎是一些有用的东西,可以作为装饰器包含在
atexit
中,或者可能包含在
contextlib
-
中,并具有退出状态(main、func,即获取退出状态):…
import sys
def main():
    pass
    sys.exit(2) #comment this out, or change the exit status to 0 to test.

try:
    main()
except SystemExit as e:
    if e.args[0]:  #non-zero exit status
        print "Failed"
    else:
        print "Success"
    raise
else:
    print "Success"