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


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


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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.