どのように出口からPythonなトレースバック?
質問
うかい口から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()
他のヒント
おそらく、あなたはすべての例外をキャッチしようとしている、これは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()
を呼び出すコードでは、これを行います。フォークプロセスがSystemExit
を発生させたときにunittestのは、取得します。これは間違いなく、コーナーケースです!
import sys
sys.exit(1)
import sys; sys.exit(0)
ような何か?
次のコードすることができること例外、出口のないトレースバック:
import os
os._exit(1)
この問題と関連する回答 できます。驚いたのはなぜ他のすべての回答でovercomplicated.
これは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
その他のエラーが発生した場合、我々はまだ完全なトレースバック出力を取得します。
ビルトインPythonの関数は(終了)、それはそれだ使用してください。 任意のライブラリをインポートする必要はありません。 私のpython 3.4を使用しています。
私は、このようにそれを行うだろう。
import sys
def do_my_stuff():
pass
if __name__ == "__main__":
try:
do_my_stuff()
except SystemExit, e:
print(e)
タグについては何
import sys
....
....
....
sys.exit("I am getting the heck out of here!")
はありませんトレースバックと何とかより明確ます。
# 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