Esta é uma pergunta sobre a qual me pergunto há algum tempo, mas nunca encontrei uma solução adequada. Se eu executar um script e me deparar, digamos um IndexError, o python imprime a linha, o local e a descrição rápida do erro e sai. É possível iniciar automaticamente o pdb quando um erro é encontrado? Não sou contra ter uma declaração de importação extra na parte superior do arquivo, nem algumas linhas de código extras.
216
Respostas:
Você pode usar o traceback.print_exc para imprimir o traceback das exceções. Em seguida, use sys.exc_info para extrair o traceback e, finalmente, chame pdb.post_mortem com esse traceback
Se você deseja iniciar uma linha de comando interativa com code.interact usando os locais do quadro em que a exceção se originou, você pode executar
fonte
code
mais,pdb
já que o último parece expandir-se?code
?sys.exc_info
para extrair o retorno e, finalmente, liguepdb.post_mortem
com esse retorno . Você não precisa passar o objeto de rastreamento parapdb.post_mortem
. Da documentação : se nenhum retorno for fornecido, ele usará a exceção que está sendo tratada no momento (uma exceção deve ser tratada para que o padrão seja usado).Se você não fornecer o
-c continue
sinalizador, precisará digitar 'c' (para Continuar) quando a execução começar. Em seguida, ele será executado no ponto de erro e lhe dará o controle lá. Conforme mencionado por eqzx , esse sinalizador é uma nova adição no python 3.2, portanto é necessário inserir 'c' para versões anteriores do Python (consulte https://docs.python.org/3/library/pdb.html ).fonte
gdb
; e quando você digita 'r'pdb
, o programa realmente é executado, mas NÃO para (nem gera backtrace) por erro; fiquei confuso até ler isso. Felicidades!ipdb
; e, é claro, argumentos podem ser adicionados após o script!Use o seguinte módulo:
Nomeie
debug
(ou o que você quiser) e coloque-o em algum lugar do seu caminho pythonAgora, no início do seu script, basta adicionar um
import debug
.fonte
try-catch
IMO feio.pudb
maispdb
. Continue voltando para copiar e colar, o que certamente diz algo sobre a falta de ordem na minha vida.O Ipython possui um comando para alternar esse comportamento: % pdb . Ele faz exatamente o que você descreveu, talvez um pouco mais (fornecendo backtraces mais informativos com destaque de sintaxe e conclusão de código). Definitivamente vale a pena tentar!
fonte
%debug
permite abrir o depurador após encontrar um erro. Eu geralmente prefiro isso%pdb
. (O trade-off é apenas digitandoq
cada vez que você não quer depurar um vs. erro de digitação%debug
cada vez que você fazer deseja depurar um erro.)c.InteractiveShell.pdb = True
éipython_config.py
ativada%pdb
automaticamente para cada sessão.Este não é o depurador, mas provavelmente tão útil (?)
Eu sei que ouvi Guido mencionar isso em um discurso em algum lugar.
Acabei de verificar python -? E, se você usar o comando -i, poderá interagir onde seu script parou.
Então, dado este script:
Você pode obter essa saída!
Para ser sincero, não usei isso, mas deveria ser, parece muito útil.
fonte
O IPython simplifica isso na linha de comando:
pode ser reescrito para
Ou, da mesma forma, se estiver chamando um módulo:
pode ser reescrito para
Observe o
--
para impedir que o IPython leia os argumentos do script como seus.Isso também tem a vantagem de chamar o depurador IPython aprimorado (ipdb) em vez do pdb.
fonte
Se você estiver usando
ipython
, após o lançamento, digite%pdb
fonte
Se você estiver usando o ambiente IPython, basta usar o% debug e o shell o levará de volta à linha ofensiva com o ambiente ipdb para inspeções etc. Outra opção, conforme indicado acima, é usar o magic ipdthon% pdb o mesmo.
fonte
up
edown
comandos para retornar à linha do seu código que gerou o erro.Você pode colocar esta linha no seu código:
Mais informações: Inicie o depurador python em qualquer linha
fonte
Para executá-lo sem precisar digitar c no início, use:
O Pdb possui seus próprios argumentos de linha de comando: -cc executará o comando c (ontinue) no início da execução e o programa será executado ininterruptamente até o erro.
fonte
python -m pdb script.py em python2.7, pressione continue para iniciar e ele será executado com o erro e será interrompido para depuração.
fonte
Se você estiver executando um módulo:
E agora você deseja inserir
pdb
quando ocorrer uma exceção, faça o seguinte:(ou estenda sua
PYTHONPATH
). OPYTHONPATH
é necessário para que o módulo é encontrado no caminho, uma vez que você estiver executando opdb
módulo agora.fonte
Coloque um ponto de interrupção dentro do construtor da classe de exceção mais alta na hierarquia e, na maioria das vezes, você verá onde o erro foi gerado.
Colocar um ponto de interrupção significa o que você quiser: você pode usar um IDE
pdb.set_trace
oufonte