ジェルブが言ったように、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一部の読者が気付いていないことについては、すべての組み込み例外の属性と同様に文書化されています。