Como percorrer o código Python para ajudar a depurar problemas?


186

Em Java / C #, você pode facilmente percorrer o código para rastrear o que pode estar errado, e os IDE tornam esse processo muito amigável.

Você pode rastrear o código python de maneira semelhante?

Respostas:


264

Sim! Há um depurador Python chamado pdbapenas para fazer isso!

Você pode iniciar um programa Python pdbusando pdb myscript.pyou python -m pdb myscript.py.

Existem alguns comandos que você pode emitir, os quais estão documentados na pdbpágina.

Alguns úteis para lembrar são:

  • b: defina um ponto de interrupção
  • c: continue depurando até atingir um ponto de interrupção
  • s: percorrer o código
  • n: para ir para a próxima linha de código
  • l: lista o código fonte do arquivo atual (padrão: 11 linhas, incluindo a linha que está sendo executada)
  • u: navegar para cima de um quadro de pilha
  • d: navegar para baixo em um quadro de pilha
  • p: para imprimir o valor de uma expressão no contexto atual

Se você não deseja usar um depurador de linha de comando, alguns IDEs como Pydev , Wing IDE ou PyCharm possuem um depurador de GUI. Wing e PyCharm são produtos comerciais, mas o Wing possui uma edição "Pessoal" gratuita e o PyCharm tem uma edição comunitária gratuita.


10
Uau, não acredito que estou tendo dificuldades para encontrar um pdb gráfico para linux / ubuntu. Estou esquecendo de algo? Talvez eu precise criar um plug-in SublimeText para ele.
ThorSummoner

4
O PyCharm é muito bom como um depurador gráfico e sua Community Edition é gratuita!
Pieter

@ThorSummoner, pudbé ótimo para isso. Tambémpydev
alpha_989

pdbnão é uma ferramenta de linha de comando. Para usá-lo, use python -m pdb your_script.py.
Jdhao

@jdhao Acho que não é padrão, mas no Ubuntu o pdbcomando faz parte do pythonpacote. De qualquer forma, python -m <module>está se tornando o padrão para outras coisas pip, por isso é provavelmente melhor usá-lo por padrão.
wjandrea 07/07

55

Usando o depurador interativo Python 'pdb'

O primeiro passo é fazer com que o interpretador Python entre no modo de depuração.

A. A partir da linha de comando

Maneira mais direta, a partir da linha de comando, do interpretador python

$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)

B. Dentro do intérprete

Ao desenvolver versões anteriores de módulos e experimentá-lo de forma mais iterativa.

$ python
Python 2.7 (r27:82508, Jul  3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)

C. De dentro do seu programa

Para um projeto grande e um módulo de execução demorada, é possível iniciar a depuração de dentro do programa usando import pdb e set_trace () assim:

#!/usr/bin/env python
# encoding: utf-8
#

import pdb

class MyObj(object):
    count = 5
    def __init__(self):
        self.count= 9

    def go(self):
        for i in range(self.count):
            pdb.set_trace()
            print i
        return

if __name__ == '__main__':
    MyObj(5).go()

Depuração passo a passo para entrar em mais interno

  1. Execute a próxima instrução… com “n” (próxima)

  2. Repetindo o último comando de depuração ... com ENTER

  3. Sair de tudo… com “q” (sair)

  4. Imprimir o valor das variáveis… com “p” (imprimir)

    a) pa

  5. Desativando o prompt (Pdb)… com “c” (continuação)

  6. Vendo onde você está… com “l” (lista)

  7. Entrar em sub-rotinas… com “s” (entrar em)

  8. Continuando ... mas até o final da sub-rotina atual ... com "r" (retorno)

  9. Atribuir um novo valor

    a) ! b = "B"

  10. Definir um ponto de interrupção

    a) quebrar o número da roupa

    b) interromper nome da função

    c) nome do arquivo de interrupção: roupa

  11. Ponto de interrupção temporário

    a) número de roupa de cama

  12. Ponto de interrupção condicional

    a) quebrar o número da roupa, condição

Nota: ** Todos esses comandos devem ser executados a partir de ** pdb

Para um conhecimento aprofundado, consulte: -

https://pymotw.com/2/pdb/

https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/


41

Existe um módulo chamado 'pdb' em python. Na parte superior do seu script python, você faz

import pdb
pdb.set_trace()

e você entrará no modo de depuração. Você pode usar 's' para avançar, 'n' para seguir a próxima linha semelhante ao que você faria com o depurador 'gdb'.


21

A partir do Python 3.7, você pode usar a breakpoint()função interna para inserir o depurador:

foo()
breakpoint()  # drop into the debugger at this point
bar()

Por padrão, breakpoint()importará pdbe ligará pdb.set_trace(). No entanto, você pode controlar o comportamento de depuração via sys.breakpointhook()e uso da variável de ambiente PYTHONBREAKPOINT.

Veja PEP 553 para mais informações.


2
Quando vi, breakpointfiquei empolgado. Mas então eu aprendi que é essencialmente apenas um atalho para import pdb; pdb.set_trace()e isso me deixou triste. Python devs: foco favor na melhoria PDB com o GDB básica características como linhas de contexto, histórico de comandos persistente e guia auto-completar :-)
Ciro Santilli郝海东冠状病六四事件法轮功

11

ipdb (depurador IPython)

O ipdb adiciona a funcionalidade IPython ao pdb, oferecendo as seguintes ENORME melhorias:

  • conclusão da guia
  • mostrar mais linhas de contexto
  • destaque da sintaxe

Assim como o pdg, o ipdb ainda está longe de ser perfeito e completamente rudimentar se comparado ao GDB, mas já é uma grande melhoria em relação ao pdb.

O uso é análogo pdb, basta instalá-lo com:

python3 -m pip install --user ipdb

e adicione à linha da qual você deseja depurar:

__import__('ipdb').set_trace(context=21)

Você provavelmente deseja adicionar um atalho para isso no seu editor, por exemplo, para o Vim snipmate eu tenho:

snippet ipd
    __import__('ipdb').set_trace(context=21)

para que eu possa digitar apenas ipd<tab>e ele se expanda para o ponto de interrupção. Em seguida, é fácil removê-lo, ddpois tudo está contido em uma única linha.

context=21aumenta o número de linhas de contexto, conforme explicado em: Como posso fazer o ipdb mostrar mais linhas de contexto durante a depuração?

Como alternativa, você também pode depurar programas desde o início com:

ipdb3 main.py

mas você geralmente não quer fazer isso porque:

  • você teria que passar por todas as definições de função e classe enquanto o Python lê essas linhas
  • Eu não sei como definir o tamanho do contexto lá sem invadir o ipdb. Patch para permitir: https://github.com/gotcha/ipdb/pull/155

Ou, alternativamente, como no pdb bruto 3.2+, você pode definir alguns pontos de interrupção na linha de comando:

ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py

embora -c cesteja quebrado por algum motivo: https://github.com/gotcha/ipdb/issues/156

python -m moduleA depuração foi solicitada em: Como depurar um módulo Python executado com python -m na linha de comando? e como o Python 3.7 pode ser feito com:

python -m pdb -m my_module

Recursos ausentes ausentes do pdb e do ipdb em comparação ao GDB:

aborrecimentos específicos do ipdb:

Testado no Ubuntu 16.04, ipdb == 0.11, Python 3.5.2.



3

Se você vem de Java / C # background, acho que sua melhor aposta seria usar o Eclipse com Pydev . Isso fornece um IDE totalmente funcional com o depurador incorporado. Eu também o uso com o django.




2

O Python Tutor é um depurador on-line de etapa única destinado a iniciantes. Você pode inserir o código na página de edição e clicar em "Visualizar execução" para iniciar a execução.

Entre outras coisas, ele suporta:

No entanto, ele também não suporta muitas coisas , por exemplo:

  • Lendo / gravando arquivos - use io.StringIOe em io.BytesIOvez disso: demo
  • Código que é muito grande, executa muito tempo ou define muitas variáveis ​​ou objetos
  • Argumentos da linha de comando
  • Muitos módulos de biblioteca padrão como argparse, csv, enum, html, os, struct, weakref ...

1

Também é possível percorrer e rastrear programaticamente o código python (e é fácil!). Consulte a documentação sys.settrace () para obter mais detalhes. Também aqui está um tutorial para você começar.



1

PyCharm é um IDE para Python que inclui um depurador. Assista a este vídeo do YouTube para obter uma introdução sobre o uso do depurador do PyCharm para percorrer o código.

Tutorial do PyCharm - Depurar código python usando PyCharm

Nota: Não se destina a ser um endosso ou revisão. O PyCharm é um produto comercial que é necessário pagar, mas a empresa fornece uma licença gratuita para estudantes e professores, além de uma versão comunitária "leve", gratuita e de código aberto.

Captura de tela

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.