Gostaria de saber como sair do Python sem ter um despejo de traceback na saída.
Ainda quero poder retornar um código de erro, mas não quero exibir o log de rastreamento.
Quero poder sair usando exit(number)
sem rastreamento, mas no caso de uma exceção (não uma saída), quero o rastreamento.
Respostas:
Você provavelmente está encontrando uma exceção e o programa está saindo por causa disso (com um rastreamento). A primeira coisa a fazer, portanto, é capturar essa exceção, antes de sair corretamente (talvez com uma mensagem, exemplo dado).
Tente algo como isso em sua
main
rotina:fonte
except Exception:
parasys.exit(0)
, inclusive. Já é o comportamento padrão imprimir um retorno em todas as exceções não tratadas e sair após o término do código, por que se preocupar em fazer o mesmo manualmente?sys.exit()
deve ser usado para programas.exit()
destina-se a conchas interativas. Veja A diferença entre exit () e sys.exit () no Python? .Talvez você esteja tentando capturar todas as exceções e isso está capturando a
SystemExit
exceção criada porsys.exit()
?Em geral, usar
except:
sem nomear uma exceção é uma má ideia. Você pega todos os tipos de coisas que não deseja capturar - comoSystemExit
- e também pode mascarar seus próprios erros de programação. Meu exemplo acima é bobo, a menos que você esteja fazendo algo em termos de limpeza. Você pode substituí-lo por:Se você precisar sair sem aumentar
SystemExit
:Eu faço isso, no código que é executado sob unittest e chama
fork()
. O Unittest fica quando o processo bifurcado aumentaSystemExit
. Este é definitivamente um caso de canto!fonte
SystemExit
apenas para ligarsys.exit(e)
? A remoção das duas linhas tem o mesmo efeito. Além disso, a limpeza pertence afinally:
, nãoexcept Exception: ... raise
.fonte
algo parecido
import sys; sys.exit(0)
?fonte
O código a seguir não gera uma exceção e sai sem um rastreamento:
Consulte esta pergunta e respostas relacionadas para obter mais detalhes. Surpreso por que todas as outras respostas são tão complicadas demais.
fonte
É uma prática muito melhor evitar o uso de sys.exit () e, em vez disso, gerar / manipular exceções para permitir que o programa termine corretamente. Se você deseja desativar o traceback, basta usar:
Você pode definir isso na parte superior do seu script para compactar toda a saída do traceback, mas eu prefiro usá-la com mais moderação, por exemplo, "erros conhecidos" onde eu quero que a saída fique limpa, por exemplo, no arquivo foo.py:
Se CalledProcessError for capturado, a saída será semelhante a esta:
Se ocorrer outro erro, ainda obteremos a saída completa do traceback.
fonte
sys.trackbacklimit
no Python 3, consulte esta resposta .Use a função python interna quit () e é isso. Não há necessidade de importar nenhuma biblioteca. Estou usando python 3.4
fonte
Eu faria assim:
fonte
A respeito
Sem rastreamento e de alguma forma mais explícita.
fonte
fonte