Como executar instruções de várias linhas no próprio depurador do Python (PDB)


157

Então, eu estou executando um script Python no qual estou chamando o depurador do Python, PDB, escrevendo:

import ipdb; ipdb.set_trace()

(Versão do iPython do PDB, embora eu não ache que isso faça diferença; eu a uso apenas para a saída colorida).

Agora, quando chego ao depurador, desejo executar uma instrução de várias linhas, como uma cláusula if ou um loop for, mas assim que digito

if condition:

e pressione a tecla Enter, recebo a mensagem de erro *** SyntaxError: invalid syntax (<stdin>, line 1)

Como alguém pode executar instruções de várias linhas no PDB? Se não for possível, existe uma maneira de contornar isso ainda executando uma cláusula if ou um loop for?

Respostas:


265

Você pode fazer isso enquanto estiver no pdb para iniciar uma sessão interativa temporária do Python com todas as variáveis ​​locais disponíveis:

(pdb) !import code; code.interact(local=vars())
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

Quando terminar, use Ctrl-D para retornar ao prompt pdb regular.

Apenas não pressione Ctrl-C, que encerrará a sessão pdb inteira.


46
Parece que o mesmo pode ser alcançado usando o interactcomando pdb ( como aprendi nesta mensagem do rastreador de erros ).
gerrit

3
Por que o !necessário na importdeclaração?
Indradhanush Gupta

19
Provavelmente não é necessário, mas eu tenho o hábito de prefixar todas as instruções Python no pdb !para evitar acidentes. Por exemplo, c = 42no pdb continuaria a execução em vez de atribuir à variável c.
Marius Gedminas

8
@MariusGedmin é a coisa mais frustrante com o PDB! Seria bom se os comandos tiveram que ser prefixado ...
Ian Clark

Nota: Ctrl-D parece ser o caminho certo para sair interacttambém, mas não funciona bem com o Spyder para mim.
Josiah Yoder 8/18

69

Em python3 ipdb(e pdb) tem um comando chamado interagir . Pode ser usado para:

Inicie um intérprete interativo (usando o módulo de código ) cujo espaço para nome global contenha todos os nomes (globais e locais) encontrados no escopo atual.

Para usá-lo, basta digitar interactno prompt pdb. Entre outras coisas, é útil para aplicar código que abrange várias linhas e também para evitar o acionamento acidental de outros comandos pdb.


2
Dá-me "NameError: o nome 'interagir' não está definido" ao fazer isso.
Jason

1
@jason versão 3.2 ou superior
vaer-k

2
Isso explica. Eu estava em python 2.7.
Jason

Cuidadoso este realmente jogou um erro que interagem poderia não está definido e saiu do processo
Camron_Godbout

1
Eu acho que sugerir para evitar interacté uma sugestão muito forte. 90% é tudo que eu preciso, e é muito mais fácil digitar do quefrom IPython import embed; embed()
vaer-k

43

Minha recomendação é usar a incorporação de IPython.

ipdb> from IPython import embed; embed()

2
Se você está tendo erro de valor não definido na compreensão da lista, tente usar no IPython import embed; embed(user_ns=locals()).
fx-kirin

1
isso funciona muito melhor para mim do que a resposta aceita. Por exemplo - ele permite a edição adequada de várias linhas - como voltar algumas linhas e consertar algo, para que você não precise reescrever toda a sua expressão de várias linhas novamente ... Estou passando os locais como @ fx-kirin sugerido.
ZeDuS 12/11/19

33

Dentro do interpretador ou depurador Python (2.7.1) (import pdb), você pode executar uma instrução de várias linhas com a seguinte sintaxe.

for i in range(5): print("Hello"); print("World"); print(i)

Nota: Quando estou dentro do intérprete, tenho que pressionar return duas vezes antes que o código seja executado. Dentro do depurador, no entanto, só preciso retornar uma vez.


5
Não permite executar nada mais profundo que um nível.
Antony Hatchkins

7

Existe um caso especial se você deseja que alguns comandos sejam executados ao atingir um ponto de interrupção. Depois, há o comando debugger commands. Permite inserir várias linhas de comandos e finalizar toda a sequência com a endpalavra-chave. Mais com (pdb) help commands.


2

Não sei se você pode fazer isso, mas seria um ótimo recurso para o ipdb. Você pode usar a compreensão da lista, é claro, e executar expressões simples de várias linhas, como:

if y == 3: print y; print y; print y;

Você também pode escrever algumas funções antecipadamente para fazer o que for necessário, o que normalmente levaria várias linhas.


-6

Escreva seu código em um editor de texto e cole-o no depurador:

if True:
    print('a')

É uma solução boba, mas também suja, rápida e de trabalho. Funciona no terminal Linux, mas não tenho certeza se funcionará no console do Windows.


3
Honestamente, eu não diria que chamar um programa externo, escrita, copiando e colando é rápida , apenas sujo: P
A Scientician Dados

4
Isto não funcionou para mim, e eles*** SyntaxError: unexpected EOF while parsing
Yash Kant
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.