トレースバックなしでPythonを終了する方法は?


277

出力にトレースバックダンプを持たずにPythonを終了する方法を知りたいのですが。

エラーコードを返せるようにしたいのですが、トレースバックログを表示したくありません。

exit(number)トレースなしで終了できるようにしたいのですが、例外の場合(終了ではなく)トレースが必要です。


8
sys.exit()は、バックトレースを出力せずに実行を停止し、例外を発生させます...あなたの質問はデフォルトの動作が正確に何であるかを説明しているので、何も変更しないでください。
Luper Rouch

@Luper sys.exit()がSystemExitをスローすることを確認するのは非常に簡単です。
Val

4
私はそれがトレースバックを出力しないと言った、それは例外を発生させないということではない。
Luper Rouch 2012年

:私は、これは本当にあなたが尋ねた質問に答えると思いstackoverflow.com/questions/173278/...
ステファン・

2
この質問は、特にJython 2.4またはそのようなものですか?最新バージョンのPython(2009年でさえ、CPython 2.6と3.1、Jython 2.5、IronPython 2.6を意味していた)の場合、この質問は意味がなく、上位の回答が間違っているためです。
abarnert 2014

回答:


300

おそらく例外が発生しており、このためプログラムは終了しています(トレースバックあり)。したがって、最初に行うべきことは、正常に終了する前に、その例外をキャッチすることです(おそらく、メッセージの例を示します)。

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()

2
最初に「sysインポートからの出口」のようなものがあるはずです。
rob

10
sys.exit()が「メインプログラム」で呼び出された場合、上記のコードはsys.exitに渡された値を破棄します。sys.exitがSystemExitを発生させ、変数 "e"に終了コードが含まれることに注意してください。
bstpierre 2009

5
stderr sys.stderr.write(msg)で印刷することをお勧めします
vinilios

14
からまでの行を削除することを強くお勧めします。処理されていないすべての例外でトレースバックを出力し、コードの終了後に終了するのは既にデフォルトの動作です。except Exception:sys.exit(0)
MestreLion

6
@jkp-コメントについて:sys.exit()プログラムで使用する必要があります。exit()インタラクティブなシェルを対象としています。Pythonでのexit()とsys.exit()の違いを参照してください
ire_and_curses 2013年

81

おそらく、すべての例外をキャッチしようとしていますが、これは?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。これは間違いなくコーナーケースです!


4
-1:このコードはばかげています:なぜSystemExit呼び出すだけでキャッチするのsys.exit(e)ですか?両方の行を削除しても同じ効果があります。また、クリーンアップはに属しfinally:、には属しませんexcept Exception: ... raise
MestreLion

@MestreLion:自由に投票できますが、あなたのコメントのすぐ上に私のコメントを読んだ場合、それは2.5+にのみ当てはまります。私の投稿をすべて読んだら、コードはばかげているとはっきり言って、コメントであなたが言ったことを正確に提案しました。
bstpierre

2
申し訳ありませんが、そうです... Python 2.5には例外の主要な再構成があったことを忘れていました。私は反対票を取り消そうとしましたが、SOは、回答が編集された場合にのみ、それを行うことができます。では、2012年でPython 2.4は古代の歴史なので、編集して正しい(現在の)コードを前もって表示し、2.5より前のメソッドを脚注として残しませんか?回答が大幅に改善され、反対票を取り消すことができます。喜んでそうします。すべての人にとって
メリット

@MestreLion:私はあなたが提案したように編集を始めましたが、この回答は質問と2.4環境のコンテキストでのみ意味があります。反対投票は私を怒らせません。
bstpierre


9

のようなものimport sys; sys.exit(0)


@mestreLionでは、なぜDets 06 18:53:17 Traceback(最後の最新の呼び出し)が返されるのでしょうか。sys.exit(0)SystemExit:コンソールのorg.python.core.PyException.fillInStackTrace(PyException.java:70)で0?
ヴァル

3
@Val:標準のPythonコンソールを使用していないため。JythonはPythonではなく、例外(または少なくともコンソール)が例外を異なる方法で処理するように見えます。
MestreLion



4

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

その他のエラーが発生した場合でも、完全なトレースバック出力が得られます。


1
sys.trackbacklimitPython 3での使用については、この回答を参照してください。
Acumenus 2016年

4

組み込みのPython関数quit()を使用すれば、それだけです。ライブラリをインポートする必要はありません。私はpython 3.4を使用しています


2

私はそれをこのようにします:

import sys

def do_my_stuff():
    pass

if __name__ == "__main__":
    try:
        do_my_stuff()
    except SystemExit, e:
        print(e)

0

どうですか

import sys
....
....
....
sys.exit("I am getting the heck out of here!")

トレースバックはなく、どういうわけかより明示的です。


-8
# 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

7
コードにコメントを付けると、回答の質が向上します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.