出力にトレースバックダンプを持たずにPythonを終了する方法を知りたいのですが。
エラーコードを返せるようにしたいのですが、トレースバックログを表示したくありません。
exit(number)
トレースなしで終了できるようにしたいのですが、例外の場合(終了ではなく)トレースが必要です。
出力にトレースバックダンプを持たずにPythonを終了する方法を知りたいのですが。
エラーコードを返せるようにしたいのですが、トレースバックログを表示したくありません。
exit(number)
トレースなしで終了できるようにしたいのですが、例外の場合(終了ではなく)トレースが必要です。
回答:
おそらく例外が発生しており、このためプログラムは終了しています(トレースバックあり)。したがって、最初に行うべきことは、正常に終了する前に、その例外をキャッチすることです(おそらく、メッセージの例を示します)。
main
ルーチンで次のようなことを試してください。
import sys, traceback
def main():
try:
do main program stuff here
....
except KeyboardInterrupt:
print "Shutdown requested...exiting"
except Exception:
traceback.print_exc(file=sys.stdout)
sys.exit(0)
if __name__ == "__main__":
main()
except Exception:
sys.exit(0)
sys.exit()
プログラムで使用する必要があります。exit()
インタラクティブなシェルを対象としています。Pythonでのexit()とsys.exit()の違いを参照してください。。
おそらく、すべての例外をキャッチしようとしていますが、これは?SystemExit
によって発生した例外をキャッチしていますsys.exit()
。
import sys
try:
sys.exit(1) # Or something that calls sys.exit()
except SystemExit as e:
sys.exit(e)
except:
# Cleanup and reraise. This will print a backtrace.
# (Insert your cleanup code here.)
raise
一般に、except:
例外に名前を付けずに使用することは悪い考えです。キャッチしたくないすべての種類のものをキャッチしSystemExit
ます。たとえば、独自のプログラミングエラーを隠すこともできます。上記の私の例は、クリーンアップに関して何かをしているのでない限り、ばかげています。あなたはそれを次のように置き換えることができます:
import sys
sys.exit(1) # Or something that calls sys.exit().
レイズせずに終了する必要がある場合SystemExit
:
import os
os._exit(1)
unittestで実行され、を呼び出すコードでこれを行いますfork()
。Unittestは、フォークされたプロセスが発生したときに取得しますSystemExit
。これは間違いなくコーナーケースです!
SystemExit
呼び出すだけでキャッチするのsys.exit(e)
ですか?両方の行を削除しても同じ効果があります。また、クリーンアップはに属しfinally:
、には属しませんexcept Exception: ... raise
。
import sys
sys.exit(1)
のようなものimport sys; sys.exit(0)
?
次のコードは例外を発生させず、トレースバックなしで終了します。
import os
os._exit(1)
詳細については、この質問と関連する回答を参照してください。他のすべての回答が複雑すぎる理由に驚いています。
sys.exit()の使用を避け、代わりに例外を発生/処理して、プログラムが正常に終了するようにすることをお勧めします。トレースバックをオフにしたい場合は、以下を使用します。
sys.trackbacklimit=0
これをスクリプトの上部に設定して、すべてのトレースバック出力を押しつぶすことができますが、たとえば「foo.py」ファイルのように出力をクリーンにしたい「既知のエラー」など、より控えめに使用することを好みます。
import sys
from subprocess import *
try:
check_call([ 'uptime', '--help' ])
except CalledProcessError:
sys.tracebacklimit=0
print "Process failed"
raise
print "This message should never follow an error."
CalledProcessErrorがキャッチされると、出力は次のようになります。
[me@test01 dev]$ ./foo.py
usage: uptime [-V]
-V display version
Process failed
subprocess.CalledProcessError: Command '['uptime', '--help']' returned non-zero exit status 1
その他のエラーが発生した場合でも、完全なトレースバック出力が得られます。
sys.trackbacklimit
Python 3での使用については、この回答を参照してください。
組み込みのPython関数quit()を使用すれば、それだけです。ライブラリをインポートする必要はありません。私はpython 3.4を使用しています
# Pygame Example
import pygame, sys
from pygame.locals import *
pygame.init()
DISPLAYSURF = pygame.display.set_mode((400, 300))
pygame.display.set_caption('IBM Emulator')
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
fontObj = pygame.font.Font('freesansbold.ttf', 32)
textSurfaceObj = fontObj.render('IBM PC Emulator', True, GREEN,BLACK)
textRectObj = textSurfaceObj.get_rect()
textRectObj = (10, 10)
try:
while True: # main loop
DISPLAYSURF.fill(BLACK)
DISPLAYSURF.blit(textSurfaceObj, textRectObj)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
except SystemExit:
pass