Как выйти из Python без трассировки?

Я хотел бы знать, как выйти из Python, не имея дампа трассировки на выходе.

Я все еще хочу иметь возможность вернуть код ошибки, но я не хочу отображать журнал трассировки.

Я хочу иметь возможность выйти с помощью exit(number) без трассировки, но в случае исключения (не выход) я хочу трассировку.

Ответ 1

Предположительно вы сталкиваетесь с исключением, и из-за этого программа выходит из нее (с трассировкой). Первое, что нужно сделать, - это поймать это исключение, прежде чем выйти из него чисто (возможно, с сообщением, приведенным примером).

Попробуйте что-то подобное в вашей процедуре 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

Возможно, вы пытаетесь поймать все исключения, и это вызывает исключение 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. Это, безусловно, угловой случай!

Ответ 3

import sys
sys.exit(1)

Ответ 4

что-то вроде import sys; sys.exit(0)?

Ответ 5

Следующий код не вызовет исключение и завершится без трассировки:

import os
os._exit(1)

См. этот вопрос и связанные с ним ответы для получения более подробной информации. Удивлен, почему все остальные ответы слишком сложны.

Ответ 6

Намного лучше избегать использования sys.exit() и вместо этого создавать/обрабатывать исключения, чтобы позволить программе закончить чисто. Если вы хотите отключить отслеживание, просто используйте:

sys.trackbacklimit=0

Вы можете установить это в верхней части своего script, чтобы сквоить весь вывод трассировки, но я предпочитаю использовать его более экономно, например "известные ошибки", где я хочу, чтобы результат был чистым, например. в файле 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, вывод будет выглядеть следующим образом:

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

Если возникает другая ошибка, мы все равно получаем полный вывод traceback.

Ответ 7

Используйте встроенную функцию python quit() и ее. Нет необходимости импортировать какую-либо библиотеку. Я использую python 3.4

Ответ 8

Я бы сделал это следующим образом:

import sys

def do_my_stuff():
    pass

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

Ответ 9

Что насчет

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

Нет трассировки и как-то более явным.

Ответ 10

# 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