Как сказал Иеруб, os._exit(1)
- это ваш ответ. Но, учитывая, что он обходит все процедуры очистки, включая finally:
блоки, закрытие файлов и т. Д., И его действительно следует избегать любой ценой, могу ли я представить более безопасный способ его использования?
Если ваша проблема в том, что SystemExit
пойман на внешних уровнях (т. Е. Unittest), тогда будет внешним уровнем самостоятельно! Сверните ваш основной код в блоке try / Кроме , поймать SystemExit и вызвать 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
# ...
except SystemExit as e:
if e.code != EMERGENCY:
raise # normal exit, let unittest catch it
else:
os._exit(EMERGENCY) # try to stop *that*, sucker!