ジェルブが言ったように、os._exit(1)
あなたの答えです。ただし、ブロック、ファイルのクローズなどを含むすべてのクリーンアップ手順をバイパスすることを考えると、絶対finally:
に避けるべきです。では、より安全な(っぽい)使用方法を提示できますか?
問題が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
一部の読者が気付いていないことについては、すべての組み込み例外の属性と同様に文書化されています。