cair no interpretador python enquanto executa a função

90

eu tenho um módulo python com uma função:

def do_stuff(param1 = 'a'):
    if type(param1) == int:
        # enter python interpreter here
        do_something()
    else:
        do_something_else()

existe uma maneira de cair no interpretador de linha de comando onde tenho o comentário? para que se eu executar o seguinte em python:

>>> import my_module
>>> do_stuff(1)

recebo meu próximo prompt no escopo e contexto de onde tenho o comentário do_stuff()?

Aaronstacia
fonte
Possível duplicata de Enter Interactive Mode In Python
Mad Physicist

Respostas:

60

Inserindo

import pdb; pdb.set_trace()

irá entrar no depurador python nesse ponto

Veja aqui: http://docs.python.org/library/pdb.html

prestomação
fonte
pdbé um grande python baunilha; se você tem espaço para trazer um pacote externo, ipdbé ótimo - a mesma funcionalidade do depurador, mas com o realce de sintaxe, preenchimento de tab, etc. de ipython
khstacking
Update - ipdbfoi descontinuado, hoje em dia eu uso pdbpp( pdb++) , que tem recursos semelhantes, e funciona com import pdb; pdb.set_trace()(ou seja, corrige essa importação, então é uma substituição
imediata
@hangtwenty: por que você diz que ipdbfoi descontinuado? Não consigo encontrar nenhuma notícia disso.
Nick Matteo
@Kundor huh, você está certo. Lembro-me claramente de ter lido em algum lugar que os autores decidiram parar de manter o projeto e indicaram outro projeto para usar em seu lugar. Será que isso aconteceu um pouco e depois foi ressuscitado? Eu poderia estar errado! Em qualquer caso, eu gostava ipdbantes, mas tenho gostado pdbppdesde
driftcatcher
141

Se quiser um prompt interativo padrão (em vez do depurador, conforme mostrado por prestomation), você pode fazer o seguinte:

import code
code.interact(local=locals())

Veja: o módulo de código .

Se você tiver o IPython instalado e quiser um shell IPython, pode fazer isso para IPython> = 0,11:

import IPython; IPython.embed()

ou para versões mais antigas:

from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell(local_ns=locals())
Matt Anderson
fonte
27
para IPython> = 0.11, não há mais módulo Shell no IPython ... então inicie-o usando "import IPython; IPython.embed ()".
evandrix
É possível continuar depois de entrar code.interact(), a la PDB c(ontinue)?
Nick T de
4
code.interact()é uma chamada de bloqueio. Seu programa irá parar e aguardar que termine. Se você sair do interpretador interativo, seu programa deve continuar com a instrução imediatamente seguinte.
Matt Anderson
1
Qual é a diferença entre um prompt interativo e um depurador?
StockB
1
@StockB É o prompt interativo padrão que o torna importante. O depurador é um prompt interativo, mas não é o mesmo. No PDB, você não pode fazer instruções de várias linhas, a helpfunção integrada é substituída, etc.
kbrose
28

Se você quiser um interpretador Python padrão, você pode fazer

import code
code.interact(local=dict(globals(), **locals()))

Isso permitirá o acesso a locais e globais.

Se você quiser usar um interpretador IPython, a IPShellEmbedsolução está desatualizada . Atualmente, o que funciona é:

from IPython import embed
embed()
Ronan Paixão
fonte
8
obrigado, code.interact(local=dict(globals(), **locals()))é muito melhor do que code.interact(local=locals())porque o último faz você reimportar pacotes
s2t2
Essa resposta funcionou melhor para mim, pois eu estava usando um script bash para chamar meu código Python. Não consegui interagir com meu código python usando a resposta aceita. Obrigado!
Jonathanking de