出力にトレースバックダンプを表示せずに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 __== "__main__":
main()
おそらくあなたはすべての例外をキャッチしようとしていますが、これは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
を上げたときに取得します。これは間違いなくコーナーケースです!
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
他のエラーが発生した場合でも、完全なトレースバック出力が得られます。
組み込みのpython関数quit()を使ってください。ライブラリをインポートする必要はありません。私はPython 3.4を使っています
私はこうします:
import sys
def do_my_stuff():
pass
if __== "__main__":
try:
do_my_stuff()
except SystemExit, e:
print(e)
どうですか?
import sys
....
....
....
sys.exit("I am getting the heck out of here!")
トレースバックはなく、どういうわけかより明示的です。