Как выйти из 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