caer en el intérprete de Python mientras se ejecuta la función

90

tengo un módulo de Python con una función:

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

¿Hay alguna manera de acceder al intérprete de línea de comandos donde tengo el comentario? de modo que si ejecuto lo siguiente en python:

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

obtengo mi siguiente mensaje en el alcance y contexto de donde tengo el comentario do_stuff()?

Aaronstacy
fuente
Posible duplicado de Entrar en modo interactivo en Python
Mad Physicist

Respuestas:

61

Insertar

import pdb; pdb.set_trace()

entrará en el depurador de Python en ese punto

Vea aquí: http://docs.python.org/library/pdb.html

prestomación
fuente
pdbes una gran pitón vainilla; si tiene espacio para traer un paquete externo, ipdbes excelente: la misma funcionalidad que el depurador, pero con el resaltado de sintaxis, la finalización de pestañas, etc. de ipython
khstacking
Actualización: ipdbestaba en desuso, hoy en día uso pdbpp( pdb++) , que tiene características similares y funciona con import pdb; pdb.set_trace()(es decir, parchea esa importación, por lo que es un reemplazo
directo
@hangtwenty: ¿por qué dices que ipdbfue desaprobado? No puedo encontrar ninguna noticia de eso.
Nick Matteo
@Kundor eh, tienes razón. Recuerdo claramente haber leído en algún lugar que los autores habían decidido dejar de mantener el proyecto y señalaron otro proyecto para usar en su lugar. ¿Quizás eso pasó por un tiempo y luego resucitó? ¡Podría estar equivocado! En cualquier caso, disfruté ipdbantes, pero disfruté pdbppdesde entonces
driftcatcher
144

Si desea un indicador interactivo estándar (en lugar del depurador, como se muestra en prestomation), puede hacer esto:

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

Ver: el módulo de código .

Si tiene IPython instalado y desea un shell de IPython en su lugar, puede hacer esto para IPython> = 0.11:

import IPython; IPython.embed()

o para versiones anteriores:

from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell(local_ns=locals())
Matt Anderson
fuente
27
para IPython> = 0.11, no hay más módulo Shell en IPython ... así que inícielo usando "import IPython; IPython.embed ()" en su lugar.
evandrix
¿Es posible continuar después de entrar code.interact(), a la PDB c(ontinue)?
Nick T
4
code.interact()es una llamada de bloqueo. Su programa se detendrá y esperará a que termine. Si sale del intérprete interactivo, su programa debe reanudarse con la declaración inmediatamente siguiente.
Matt Anderson
1
¿Cuál es la diferencia entre un mensaje interactivo y un depurador?
StockB
1
@StockB Es el indicador interactivo estándar lo que lo hace importante. El depurador es un mensaje interactivo, pero no es lo mismo. En PDB, no puede hacer declaraciones de varias líneas, la helpfunción incorporada se
anula
29

Si desea un intérprete de Python predeterminado, puede hacerlo

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

Esto permitirá el acceso tanto a locales como a globales.

Si desea ingresar a un intérprete de IPython, la IPShellEmbedsolución está desactualizada . Actualmente lo que funciona es:

from IPython import embed
embed()
Ronan Paixão
fuente
8
gracias, code.interact(local=dict(globals(), **locals()))es mucho mejor que code.interact(local=locals())porque este último te hace volver a importar paquetes
s2t2
Esta respuesta funcionó mejor para mí ya que estaba usando un script bash para llamar a mi código Python. No pude interactuar con mi código de Python usando la respuesta aceptada. ¡Gracias!
jonathanking