Quais são as suas melhores dicas para depurar Python?
Por favor, não liste apenas um depurador em particular sem dizer o que ele realmente pode fazer.
Relacionado
- Quais são as boas maneiras de fazer meu código Python ser executado pela primeira vez? - Isso discute a minimização de erros
Respostas:
APO
Você pode usar o módulo pdb, inserir em
pdb.set_trace()
qualquer lugar e ele funcionará como um ponto de interrupção.Para continuar a execução, use
c
(oucont
oucontinue
).É possível executar expressões arbitrárias em Python usando pdb. Por exemplo, se você encontrar um erro, poderá corrigir o código e digitar uma expressão de tipo para ter o mesmo efeito no código em execução
ipdb é uma versão do pdb para IPython . Ele permite o uso do pdb com todos os recursos do IPython, incluindo o preenchimento de guias.
Também é possível definir o pdb para executar automaticamente em uma exceção não capturada.
O Pydb foi escrito para ser uma versão aprimorada do Pdb. Benefícios?
fonte
myserver.com/pdb
no modo de depuração que simplesmente fazimport pdb; pdb.set_trace()
. Se você estiver usando o Flask / Werkzeug que possui um depurador interativo, também é possível ter uma exibiçãoassert False
.http://pypi.python.org/pypi/pudb , um depurador Python em tela cheia e baseado em console.
Bom para depurar scripts independentes, basta executar
fonte
pip install pudb
Se você estiver usando pdb, poderá definir aliases para atalhos. Eu uso estes:
fonte
Exploração madeireira
O Python já possui um excelente módulo de log embutido . Você pode usar o modelo de log aqui .
O módulo de registro permite especificar um nível de importância; durante a depuração, você pode registrar tudo, enquanto durante a operação normal, você pode registrar apenas coisas críticas. Você pode desligar e ligar as coisas.
A maioria das pessoas usa apenas instruções básicas de impressão para depurar e remove as instruções de impressão. É melhor deixá-los dentro, mas desativá-los; então, quando você tiver outro bug, basta reativar tudo e examinar seus logs.
Essa pode ser a melhor maneira possível de depurar programas que precisam fazer as coisas rapidamente, como programas de rede que precisam responder antes que a outra extremidade da conexão expire e desapareça. Você pode não ter muito tempo para executar uma etapa em um depurador; mas você pode simplesmente deixar seu código rodar e registrar tudo, depois examinar os logs e descobrir o que realmente está acontecendo.
EDIT: O URL original dos modelos era: http://aymanh.com/python-debugging-techniques
Como esta página está ausente, substituí-a por uma referência ao instantâneo salvo em archive.org: http://web.archive.org/web/20120819135307/http://aymanh.com/python-debugging-techniques
Caso desapareça novamente, aqui estão os modelos que mencionei. Este é um código retirado do blog; Eu não escrevi.
E aqui está sua explicação de como usar o descrito acima. Novamente, não recebo o crédito por isso:
Por padrão, o módulo de registro imprime mensagens críticas, de erro e de aviso. Para alterar isso para que todos os níveis sejam impressos, use:
Para enviar mensagens de log para um arquivo chamado debug.log, use:
fonte
É possível imprimir quais linhas Python são executadas (obrigado Geo!). Isso tem vários aplicativos, por exemplo, você pode modificá-lo para verificar quando determinadas funções são chamadas ou adicionar algo como ## para rastrear apenas linhas específicas.
code.interact leva você a um console interativo
Se você quiser acessar facilmente o histórico do console, consulte: " Posso ter um mecanismo de histórico como o shell? " (Terá que procurar por ele).
O preenchimento automático pode ser ativado para o intérprete .
fonte
O ipdb é como o pdb, com a grandiosidade do ipython.
fonte
print
afirmaçõesdebug_print
função em vez de imprimir para facilitar a desativaçãopprint
módulo é inestimável para estruturas complexasfonte
a maneira óbvia de depurar um script
se você não sabe exatamente onde está esse script
fonte
PyDev
O PyDev tem um bom depurador interativo. Ele possui expressões de observação, lista suspensa para avaliar, listas de encadeamentos e pilhas e (quase) todas as comodidades usuais que você espera de um depurador visual moderno. Você pode até se conectar a um processo em execução e fazer depuração remota.
Porém, como outros depuradores visuais, acho útil principalmente para problemas simples ou para problemas muito complicados depois de tentar tudo o resto. Eu ainda faço a maior parte do trabalho pesado com o registro.
fonte
Se você conhece o Visual Studio, o Python Tools for Visual Studio é o que você procura.
fonte
O Winpdb é muito bom e, ao contrário do nome, é completamente multiplataforma.
Ele tem um ótimo depurador de GUI e baseado em prompt , e suporta depuração remota.
fonte
No Vim, eu tenho essas três ligações:
rpdb2
é um depurador remoto do Python, que pode ser usado com o WinPDB, um depurador gráfico sólido. Porque eu sei que você perguntará, ele pode fazer tudo o que eu espero que um depurador gráfico faça :)Uso
pdb
denose.tools
para depurar testes de unidade e código normal.Por fim, o
F7
mapeamento imprimirá um retorno (semelhante ao que você obtém quando uma exceção borbulha no topo da pilha). Eu achei isso realmente útil mais do que algumas vezes.fonte
Definindo métodos repr () úteis para suas classes (para que você possa ver o que é um objeto) e usando repr () ou "% r"% (...) ou "... {0! R} ..". Format (...) em suas mensagens / logs de depuração é IMHO uma chave para uma depuração eficiente.
Além disso, os depuradores mencionados em outras respostas farão uso dos métodos repr ().
fonte
Obtendo um rastreamento de pilha de um aplicativo Python em execução
Existem vários truques aqui . Esses incluem
fonte
Se você não gosta de gastar tempo com depuradores (e não aprecia a pouca usabilidade da
pdb
interface da linha de comandos), pode despejar o rastreio de execução e analisá-lo mais tarde. Por exemplo:Isso irá despejar toda a linha de
setup.py install
execução de origem paraexecution.log
.Para facilitar a personalização da saída do rastreio e escrever seus próprios rastreadores, reuni algumas partes do código no módulo xtrace (domínio público).
fonte
Quando possível, depuro usando
M-x pdb
no emacs para depuração no nível da fonte.fonte
Existe um curso on-line completo chamado " Software Debugging ", de Andreas Zeller, sobre o Udacity, com dicas sobre depuração:
Altamente recomendado.
fonte
se você quiser uma boa maneira gráfica de imprimir sua pilha de chamadas de forma legível, confira este utilitário: https://github.com/joerick/pyinstrument
Execute a partir da linha de comando:
Execute como um módulo:
Execute com django:
Basta adicionar
pyinstrument.middleware.ProfilerMiddleware
paraMIDDLEWARE_CLASSES
, em seguida, adicionar?profile
ao final da URL pedido para ativar o gerador de perfil.fonte