web-dev-qa-db-ja.com

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

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

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

トレースなしでexit(number)を使用して終了できるようにしたいのですが、例外(終了ではない)の場合はトレースを実行します。

253
sorin

おそらくあなたは例外に遭遇していて、プログラムはこれのために(トレースバックで)終了しています。したがって、最初にやるべきことは、きれいに終了する前にその例外をキャッチすることです(おそらくメッセージ、例を挙げて)。

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 __== "__main__":
    main()
275
jkp

おそらくあなたはすべての例外をキャッチしようとしていますが、これはsys.exit()によって発生したSystemExit例外をキャッチしているのでしょうか。

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を上げたときに取得します。これは間違いなくコーナーケースです!

76
bstpierre
import sys
sys.exit(1)
45

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

11
rob

次のコードは例外を発生させず、トレースバックなしで終了します。

import os
os._exit(1)

この質問と関連する回答を参照してください 詳細については/ /。他のすべての答えがなぜそれほど複雑すぎるのか驚いた。

7
IlliakaillI

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

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

5
RCross

組み込みのpython関数quit()を使ってください。ライブラリをインポートする必要はありません。私はPython 3.4を使っています

4

私はこうします:

import sys

def do_my_stuff():
    pass

if __== "__main__":
    try:
        do_my_stuff()
    except SystemExit, e:
        print(e)
2
Karl W.

どうですか?

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

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

1
agcala