Как выйти из Python без трассировки?
Я хотел бы знать, как я выхожу из Python, не имея дампа трассировки на выходе.
Я все еще хочу иметь возможность возвращать код ошибки, но я не хочу отображать журнал обратной трассировки.
Я хочу иметь возможность выйти с помощью exit(number) без трассировки, но в случае исключения (не выход) я хочу след.
10 ответов:
вы предположительно столкнулись с исключением, и программа выходит из-за этого (с обратной трассировкой). Поэтому первое, что нужно сделать, это поймать это исключение, прежде чем выходить чисто (возможно, с сообщением, приведенным в Примере).
попробуйте что-то вроде этого в вашем
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()
возможно, вы пытаетесь поймать все исключения, и это ловить
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. Это, безусловно, случай!
гораздо лучше практиковать, чтобы избежать использования sys.выйдите () и вместо этого поднимите/обработайте исключения, чтобы позволить программе закончить чисто. Если вы хотите отключить трассировку, просто используйте:
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 __name__ == "__main__": try: do_my_stuff() except SystemExit, e: print(e)
следующий код не вызовет исключение и завершится без обратной трассировки:
import os os._exit(1)см. этот вопрос и связанные с ним ответы для более подробной информации. Удивлен, почему все остальные ответы так сложны.
а как же
import sys .... .... .... sys.exit("I am getting the heck out of here!")нет трассировки и как-то более явным.
# 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
Comments