Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to exit from Python without traceback?

I would like to know how to I exit from Python without having an traceback dump on the output.

I still want want to be able to return an error code but I do not want to display the traceback log.

I want to be able to exit using exit(number) without trace but in case of an Exception (not an exit) I want the trace.

like image 494
sorin Avatar asked Jul 27 '09 12:07

sorin


People also ask

How do I completely exit a Python program?

Technique 1: Using quit() function The in-built quit() function offered by the Python functions, can be used to exit a Python program. As soon as the system encounters the quit() function, it terminates the execution of the program completely.


8 Answers

You are presumably encountering an exception and the program is exiting because of this (with a traceback). The first thing to do therefore is to catch that exception, before exiting cleanly (maybe with a message, example given).

Try something like this in your main routine:

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()
like image 97
jkp Avatar answered Oct 06 '22 08:10

jkp


Perhaps you're trying to catch all exceptions and this is catching the SystemExit exception raised by 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

In general, using except: without naming an exception is a bad idea. You'll catch all kinds of stuff you don't want to catch -- like SystemExit -- and it can also mask your own programming errors. My example above is silly, unless you're doing something in terms of cleanup. You could replace it with:

import sys
sys.exit(1) # Or something that calls sys.exit().

If you need to exit without raising SystemExit:

import os
os._exit(1)

I do this, in code that runs under unittest and calls fork(). Unittest gets when the forked process raises SystemExit. This is definitely a corner case!

like image 21
bstpierre Avatar answered Oct 06 '22 08:10

bstpierre


import sys
sys.exit(1)
like image 23
Wojciech Bederski Avatar answered Oct 06 '22 06:10

Wojciech Bederski


The following code will not raise an exception and will exit without a traceback:

import os
os._exit(1)

See this question and related answers for more details. Surprised why all other answers are so overcomplicated.

This also will not do proper cleanup, like calling cleanup handlers, flushing stdio buffers, etc. (thanks to pabouk for pointing this out)

like image 21
IlliakaillI Avatar answered Oct 06 '22 06:10

IlliakaillI


something like import sys; sys.exit(0) ?

like image 29
rob Avatar answered Oct 06 '22 08:10

rob


It's much better practise to avoid using sys.exit() and instead raise/handle exceptions to allow the program to finish cleanly. If you want to turn off traceback, simply use:

sys.trackbacklimit=0

You can set this at the top of your script to squash all traceback output, but I prefer to use it more sparingly, for example "known errors" where I want the output to be clean, e.g. in the file 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."

If CalledProcessError is caught, the output will look like this:

[me@test01 dev]$ ./foo.py
usage: uptime [-V]
    -V    display version
Process failed
subprocess.CalledProcessError: Command '['uptime', '--help']' returned non-zero exit status 1

If any other error occurs, we still get the full traceback output.

like image 29
RCross Avatar answered Oct 06 '22 07:10

RCross


Use the built-in python function quit() and that's it. No need to import any library. I'm using python 3.4

like image 34
Miled Louis Rizk Avatar answered Oct 06 '22 07:10

Miled Louis Rizk


I would do it this way:

import sys

def do_my_stuff():
    pass

if __name__ == "__main__":
    try:
        do_my_stuff()
    except SystemExit, e:
        print(e)
like image 43
Karl W. Avatar answered Oct 06 '22 07:10

Karl W.