正如杰鲁布所说,os._exit(1)
这是你的答案。但是,考虑到它绕过了所有清理过程,包括finally:
块、关闭文件等,应该不惜一切代价避免它。那么我可以提出一种更安全(-ish)的使用方式吗?
如果您的问题SystemExit
在外部级别(即单元测试)被捕获,那么您自己就是外部级别!将您的主要代码包装在try
/except
块中,catchSystemExit
并在那里调用os._exit()
,而且只有那里!这样你就可以sys.exit
在代码的任何地方正常调用,让它冒泡到顶层,优雅地关闭所有文件并运行所有清理,然后调用os._exit
.
您甚至可以选择哪些出口是“紧急”出口。下面的代码是这种方法的一个例子:
import sys, os
EMERGENCY = 255 # can be any number actually
try:
# wrap your whole code here ...
# ... some code
if x: sys.exit()
# ... some more code
if y: sys.exit(EMERGENCY) # use only for emergency exits
... # yes, this is valid python!
# Might instead wrap all code in a function
# It's a common pattern to exit with main's return value, if any
sys.exit(main())
except SystemExit as e:
if e.code != EMERGENCY:
raise # normal exit, let unittest catch it at the outer level
else:
os._exit(EMERGENCY) # try to stop *that*!
至于e.code
一些读者不知道的,它被记录在案,以及所有内置异常的属性。