¿Cuál es la forma correcta de depurar en el portátil iPython?

121

Que yo sé, %debug magic puede depurar dentro de una celda.

Sin embargo, tengo llamadas a funciones en varias celdas.

Por ejemplo,

In[1]: def fun1(a)
           def fun2(b)
               # I want to set a breakpoint for the following line #
               return do_some_thing_about(b)

       return fun2(a)

In[2]: import multiprocessing as mp
       pool=mp.Pool(processes=2)
       results=pool.map(fun1, 1.0)
       pool.close()
       pool.join

Lo que probé:

  1. Traté de establecer %debugen la primera línea de la celda 1. Pero entra en modo de depuración inmediatamente, incluso antes de ejecutar la celda 2.

  2. Traté de agregar %debugla línea justo antes del código return do_some_thing_about(b). Pero luego el código se ejecuta para siempre, nunca se detiene.

¿Cuál es la forma correcta de establecer un punto de interrupción dentro del cuaderno de ipython?

Rex
fuente

Respuestas:

72

Use ipdb

Instalarlo a través de

pip install ipdb

Uso:

In[1]: def fun1(a):
   def fun2(a):
       import ipdb; ipdb.set_trace() # debugging starts here
       return do_some_thing_about(b)
   return fun2(a)
In[2]: fun1(1)

Para ejecutar el uso de línea por línea ny para ingresar a una función, use sy salga del uso del indicador de depuración c.

Para obtener una lista completa de los comandos disponibles: https://appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf

Tevin Joseph KO
fuente
ipdb no me da el mensaje de depuración en la otra celda con el código de muestra mencionado en la pregunta. Ahora el código sigue funcionando para siempre.
Rex
@Rex Para mí funciona. ¿Dónde pusiste ipdb? Poner import ipdb; ipdb.set_trace (); antes de la línea devuelve do_some_thing_about (b). Luego, llame a fun1 (a) desde la segunda celda, debería funcionar. Para salir de la solicitud de depuración, use 'c'
Tevin Joseph KO el
@Rex Actualizó la respuesta para mayor claridad.
Tevin Joseph KO
29
Esto funciona en la consola iPython pero no en el portátil iPython (que es lo que se hizo la pregunta). Cuando escribo import ipdb; ipdb.set_trace()dentro de una celda de un cuaderno diceMultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
Bill
1
nuevo en jupyter ... parece que es más adecuado para la presentación y para compartir fragmentos de código ... ¿podemos tener la funcionalidad que los IDE (como eclipse, rstudio) proporcionan como depuración real, paso a paso, puntos de interrupción, agregar reloj a la expresión y variables, etc. Al principio, parece que no es el caso, solo quiero estar seguro .....
Mahesha999
90

Puedes usar ipdbdentro de jupyter con:

from IPython.core.debugger import Tracer; Tracer()()

Editar : las funciones anteriores están en desuso desde IPython 5.1. Este es el nuevo enfoque:

from IPython.core.debugger import set_trace

Agregue set_trace()donde necesita un punto de interrupción. Tipo helpde ipdbcomandos cuando aparezca el campo de entrada.

Leopd
fuente
20
Tracerfue depreciado Ahora funciona de esta manera: from IPython.core.debugger import set_tracey set_trace()evoca un punto de interrupción. Fuente: davidhamann.de/2017/04/22/debugging-jupyter-notebooks
Anton Tarasenko
1
Práctico para usar como una línea, donde sea necesario:from IPython.core.debugger import set_trace;set_trace()
Nir
15

Su función de retorno está en línea con la función def (función principal), debe asignarle una pestaña. Y use

%%debug 

en vez de

%debug 

para depurar toda la celda, no solo la línea. Espero, tal vez esto te ayude.

Mohit Khurana
fuente
12

Siempre puede agregar esto en cualquier celda:

import pdb; pdb.set_trace()

y el depurador se detendrá en esa línea. Por ejemplo:

In[1]: def fun1(a):
           def fun2(a):
               import pdb; pdb.set_trace() # debugging starts here
           return fun2(a)

In[2]: fun1(1)
krock
fuente
¿Debería ser eso ipdb?
Rex
1
@Rex No necesariamente. ipdbes un refactor de Python Debugger que está más estrechamente integrado con IPython. pdbestá construido en.
Two-Bit Alchemist
ipdbtambién se puede usar fuera del shell de ipython y viene con algunas comodidades, como completar pestañas.
Jan
12

En Python 3.7 puede usar la función breakpoint () . Solo ingresa

breakpoint()

donde quiera que se detenga el tiempo de ejecución y desde allí puede usar los mismos comandos pdb (r, c, n, ...) o evaluar sus variables.

Vlad Bezden
fuente
2
Para agregar a esto, cuando llama a breakpoint (), puede escribir 'ayuda' en el cuadro de texto que aparece para obtener una lista de comandos.
gbeaven
Parece que hay un problema persistente de colgar después de usar breakpoint () o pdb: github.com/ipython/ipython/issues/10516
Dave Liu el
8

Simplemente escriba import pdbjupyter notebook y luego use esta hoja de trucos para depurar. Es muy conveniente.

c-> continuar, s-> paso, b 12-> establecer el punto de interrupción en la línea 12 y así sucesivamente.

Algunos enlaces útiles: Documento oficial de Python en pdb , ejemplos de depurador de Python pdb para comprender mejor cómo usar los comandos del depurador .

Algunas capturas de pantalla útiles: ingrese la descripción de la imagen aquíingrese la descripción de la imagen aquí

Flowera
fuente
Buena respuesta. Sin embargo, creo que (soy nuevo en el cuaderno Jupyter) uno debería agregar% de depuración para establecer un punto de interrupción.
Ad Infinitum
Lo que hago es copiar y pegar pdb.set_trace()donde quiero establecer un punto de interrupción, ya b line_noque no funciona en Jupyter Notebook y funciona bien en python IDLE.
flowera
¡Gracias! También cargué algunas capturas de pantalla que probé hoy. Si pudiera cambiar a Python IDLE Me encantaría hacerlo ..
flowera
Además, encuentro una manera de mostrar el número de línea en el jupyter notebook, hago clic en nueva línea y luego presiono l. Por supuesto, también puede programar su propio acceso directo, los enlaces están disponibles en el sitio web del jupyter notebook.
flowera
1
Siempre uso "p" para mostrar la lista de comandos en el cuaderno Jupyter. Cuando escribo "mostrar números de línea", el comando aparece allí con el acceso directo al lado. También puede aprender el acceso directo del comando, que desea utilizar.
Ad Infinitum
8

Después de obtener un error, en la siguiente celda simplemente ejecute %debugy listo.

Escalera mecánica
fuente
1
eso es asombroso!
Alguien
sin embargo, esto debe esperar a que ocurra la excepción, podríamos querer probar cuál es la variable en el tiempo de ejecución estableciendo algún punto de interrupción
Luk Aron
7

El %pdbcomando mágico también es bueno para usar. Sólo decir%pdb on y, posteriormente, el pdbdepurador se ejecutará en todas las excepciones, sin importar qué tan profundo en la pila de llamadas. Muy útil.

Si tiene una línea en particular que desea depurar, simplemente plantee una excepción allí (¡a menudo ya lo está!) O use el %debugcomando mágico que otras personas han estado sugiriendo.

impermeable
fuente
5

Acabo de descubrir PixieDebugger . Incluso aunque todavía no haya tenido tiempo de probarlo, realmente parece la forma más similar de depurar la forma en que se usa ipython con ipdb

ingrese la descripción de la imagen aquí

También tiene una pestaña "evaluar"

Alessandro Dentella
fuente
0

Se está poniendo a disposición un depurador nativo como una extensión de JupyterLab. Lanzado hace unas semanas, esto se puede instalar obteniendo la extensión correspondiente, así como el núcleo xeus-python (que en particular viene sin la magia conocida por los usuarios de ipykernel):

jupyter labextension install @jupyterlab/debugger
conda install xeus-python -c conda-forge

Esto permite una experiencia de depuración visual bien conocida de otros IDE.

ingrese la descripción de la imagen aquí

Fuente: un depurador visual para Jupyter

fuglede
fuente
xeus-python no se ejecuta en mi Windows 10. Verifica mi problema xeus-python en github
sergzemsk