Maneira mais simples de colocar pontos de interrupção PDB no código Python?


105

Apenas uma questão de conveniência. Tenho sido um pouco mimado com depuradores em IDEs como Visual Studio e XCode. Acho um pouco desajeitado ter que digitar import pdb; pdb.set_trace()para definir um ponto de interrupção (prefiro não importar o pdb no topo do arquivo, pois posso esquecê-lo e deixá-lo dentro).

Existe uma maneira mais simples de definir um ponto de interrupção no código Python, tão direto e discreto quanto o que você vê em um IDE?


Use PyCharm. Como poderia ser mais simples do que inserir uma linha de ponto de interrupção, exceto para executar usando um IDE Python?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Use python -m pdb <your_script>.py então b <line_number>para definir o ponto de interrupção no número da linha escolhido (sem parênteses de função). Pressione cpara continuar até o seu ponto de interrupção. Você pode ver todos os seus pontos de interrupção usando o bpróprio comando. Digite helppara ver outros comandos pdb disponíveis durante a depuração.
arcseldon

1
Desde o Python 3.7, agora você pode usar a breakpoint()função embutida. python.org/dev/peps/pep-0553
Daniel

Respostas:


117

Você pode executar seu programa a pdbpartir da linha de comando, executando

python -m pdb your_script.py

Ele vai quebrar na primeira linha, então você será capaz de adicionar um ponto de interrupção onde quiser em seu código usando o breakcomando, sua sintaxe é:

b (reak) [[nome do arquivo:] lineno | função [condição]]

É flexível o suficiente para permitir a adição de um ponto de interrupção em qualquer lugar.


24
para esclarecer este ponto, se eu pdb.set_trace()entrar no depurador, usar o lcomando (lista) e ver que quero definir um ponto de interrupção na linha 27, eu inseriria: b 27e o depurador definiria um ponto de interrupção na linha 27 (eu encontrei a documentação é um pouco difícil de entender, então queria adicionar esse ponto de esclarecimento).
benjaminmgross

9
Além disso, se você tiver um objeto xe quiser parar quando seu método ffor chamado, pode dizer break x.f, e então c(ontinue). Isso funciona mesmo se o objeto estiver em um arquivo inacessível ou foi criado dinamicamente, por exemplo, removendo-o.
osa

2
Ao depurar após um rastreamento de pilha, você pode copiar o caminho completo para um módulo e acrescentar o número da linha comob /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596
válido de

58

Você pode usar:

from pdb import set_trace as bp

code
code
bp()
code
code

não sei por que o aliasing supérfluo, mas ;-). Por alguma razão, meu IDE / Editor (vscode) estava sendo uma mare neste AM e continua sublinhando. Ver seu comentário realmente me ajudou. Tenha um ótimo dia!
MrMesees

Muito obrigado!
atracado em

Como posso forçar a importação set_traceapenas quando uso bp ()?
alper

39

No vim, tenho uma macro configurada para isso (no meu arquivo .vimrc):

map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

então posso apenas pressionar \ b (quando não estiver no modo de inserção) e adicionar um ponto de interrupção após a linha atual, ou \ B (observe a maiúscula) e colocar um antes da linha atual.

o que parece funcionar bem. A maioria dos outros editores de programadores 'simples' (emacs, sublimetext, etc) devem ter maneiras fáceis semelhantes de fazer isso.

Editar: Na verdade, tenho:

au FileType python map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
au FileType python map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

que o ativa apenas para arquivos de origem python. Você pode facilmente adicionar linhas semelhantes para javascript ou qualquer outra linguagem que você use.

Atualização de 2019 (Python 3.7+)

Python 3.7+ agora tem o embutido breakpoint()que pode substituir o anterior import pdb; pdb.set_trace()no vim. Ainda funciona da mesma forma.


2
Boa solução, e a linha adicionada também terá o recuo correto se você tiver set autoindentem seu arquivo .vimrc .
Jealie de

Sim, não consigo entender por que a maioria das distros não vem com set autoindent(e um monte de outras opções) como padrão. Uma das primeiras coisas que faço com um novo sistema é obter um melhor vimrc ...
Daniel

1
Basta usar um registro chamado vim! Salve a linha que deseja armazenar em buffer 'd' (como em d ebug) pressionando "dyye sempre que precisar, faça "dpou "dP. Aprenda os registros do vim ! Eles são muito úteis e sempre são suportados!
polvoazul

como adicionar: w depois disso?
ji-ruh

Levando o conceito de registro nomeado um pouco mais adiante, você pode gravar uma macro, realizar as operações necessárias e então parar a macro. Em seguida, cole o conteúdo da macro em seu arquivo vimrc. Por exemplo, inicie a macro com e qd, mais tarde, "dppara colar. Por fim, atribua suas instruções a um registro, sempre preenchido no vim loadup. Exemplo: let @d = 'oimport pdb; pdb.set_trace()k0:w' Agora, basta usar @dsempre que quiser colar a linha em um arquivo. O acima também salva o arquivo. Mas você terá que gravar o seu próprio (ao invés de copiar / colar acima), pois caracteres especiais estão envolvidos (para escape, etc).
arcseldon

27

Se você não quiser definir pontos de interrupção manualmente toda vez que executar o programa (no Python 3.2+), por exemplo, diga que deseja criar diretamente um ponto de interrupção na linha 3 e parar a execução aí:

python -m pdb -c "b 3" -c c your_script.py

As seguintes informações podem ajudar:

Se um arquivo .pdbrc existir no diretório pessoal do usuário ou no diretório atual, ele será lido e executado como se tivesse sido digitado no prompt do depurador. Isso é particularmente útil para aliases. Se os dois arquivos existirem, o que está no diretório inicial é lido primeiro e os aliases definidos podem ser substituídos pelo arquivo local.

Alterado na versão 3.2: .pdbrc agora pode conter comandos que continuam a depuração, como continue ou next. Anteriormente, esses comandos não tinham efeito.

Novo na versão 3.2: o pdb.py agora aceita uma opção -c que executa comandos como se fossem fornecidos em um arquivo .pdbrc, consulte Comandos do depurador.



10

É assim que você usaria pdb na linha de comando sem implementar nada em seu código-fonte (a documentação e outros recursos online não fazem um bom trabalho explicando isso a um programador que usou apenas depuradores visuais no passado):

Inicie o pdb digitando o seguinte em um prompt de shell:

python -m pdb 'python_script'

Este comando inicializa o pdb e o depurador pdb irá quebrar na primeira linha do seu python_script e esperar por uma entrada sua:

(Pdb)

Esta é a interface para comunicação com o depurador. Agora, você pode especificar seus comandos aqui. Ao contrário do uso de botões ou atalhos de teclado em depuradores visuais, aqui você usará comandos para obter os mesmos resultados.

Você pode ir para a próxima linha em seu código pelo comando "n" (próximo):

(Pdb) n

Executar um próximo exibiria o número da linha e o código específico na fonte:

> python_script(line number)method name
-> current line in the source code

Você pode definir um ponto de interrupção especificando um número de linha em seu código-fonte.

(Pdb) b 50

Aqui, o depurador é definido para quebrar na linha 50. Se não houver nenhum outro ponto de interrupção, o ponto de interrupção na linha 50 será o primeiro e pode ser referenciado pelo id do ponto de interrupção que é 1 neste caso. Se você adicionar mais pontos de interrupção, eles obterão identificadores sequencialmente (ou seja, 2, 3 etc.)

Depois que um ponto de interrupção é definido, você deve continuar executando seu programa até que o pdb chegue ao ponto de interrupção da seguinte maneira:

(Pdb) c

Depois de chegar a um ponto de interrupção, você pode ir para a próxima linha, com o comando n conforme descrito anteriormente. Se quiser examinar os valores das variáveis, execute o comando de parâmetro da seguinte maneira:

(Pdb) p variable_name

Se você não precisa mais de um ponto de interrupção, pode limpá-lo passando a id do ponto de interrupção com o comando limpar:

(Pdb) clear 1

Finalmente, quando terminar de usar o depurador, você pode sair da execução da mesma forma que sairia do interpretador de linha de comando python.

(Pdb) exit()

Espero que isso ajude alguém a começar a usar PDB. Aqui está uma lista de comandos que você pode usar com o depurador: pdb so question and answers



4

Você pode usar um IDE que suporte depuração python, ou você pode verificar a excelente ferramenta Winpdb. Que funciona em qualquer plataforma e fornece recursos de depuração gráfica para seu script Python.

http://winpdb.org/


2

Você pode usar:

  • asa ide
  • eclipse com o plugin pydev
  • pycharms

Todos os itens acima oferecem suporte à depuração Python de dentro de um IDE.


0

No Atom, se os plug-ins Python estiverem instalados, você pode apenas digitar ' pdb' e pressionar enter e o snippet digitará importar e rastrear de volta para você.

Eu acostumei com isso agora que às vezes eu apenas digito mesmo se eu estiver editando no vim e esperando o menu suspenso aparecer.


0

Um método subestimado é definir o ponto de interrupção no pdb diretamente:

pdb> b torch/__init__:10

irá definir um ponto de interrupção em site-packages\torch\__init__.py:10

Então pdb> cvai parar neste ponto de interrupção.

A seguir também são válidos:

pdb> b d:\anaconda\lib\site-packages\torch\__init__.py:10
pdb> b torch\__init__.py:10
pdb> b d:\\anaconda\\lib\\site-packages\\torch\\__init__.py:10
pdb> b d:/anaconda/lib/site-packages/torch/__init__.py:10

Veja doc para detalhes.


0

Você pode usar o Vim com o plugin Python-Mode ou Emacs com o plugin Elpy .

Esses plug-ins fornecem pontos de interrupção com pressionamentos de tecla fáceis ( \ bno Vim e C-c C-u bno Emacs) além de muitos outros recursos de IDEs pesados ​​(dobramento de código, refatoração, linting, etc.) - tudo dentro de um editor de texto baseado em terminal leve.


-1

A maneira mais simples de executar o depurador em seu script é apenas

pdb your_script.py

Executar pdb em uma linha de comando do Linux dá

usage: pdb.py scriptfile [arg] ...

Como instalar pdb? Ou de onde?
Kenorb de
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.