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()?


Respostas:


60

Inserindo

import pdb; pdb.set_trace()

irá entrar no depurador python nesse ponto

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


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())

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()

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
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.