debugging - notebook - usando ipdb para depurar código python en una celda(jupyter o Ipython)
jupyter python 3 (4)
Estoy usando el cuaderno jupyter (o Ipython) con firefox, y quiero depurar algún código de python en la celda. Estoy usando ''import ipdb; ipdb.set_trace () ''como tipo de punto de interrupción, por ejemplo, mi celda tiene el siguiente código:
a=4
import ipdb; ipdb.set_trace()
b=5
print a
print b
que después de la ejecución con Shift + Enter me da este error:
--------------------------------------------------------------------------
MultipleInstanceError Traceback (most recent call last)
<ipython-input-1-f2b356251c56> in <module>()
1 a=4
----> 2 import ipdb; ipdb.set_trace()
3 b=5
4 print a
5 print b
/home/nnn/anaconda/lib/python2.7/site-packages/ipdb/__init__.py in <module>()
14 # You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
15
---> 16 from ipdb.__main__ import set_trace, post_mortem, pm, run, runcall, runeval, launch_ipdb_on_exception
17
18 pm # please pyflakes
/home/nnn/anaconda/lib/python2.7/site-packages/ipdb/__main__.py in <module>()
71 # the instance method will create a new one without loading the config.
72 # i.e: if we are in an embed instance we do not want to load the config.
---> 73 ipapp = TerminalIPythonApp.instance()
74 shell = get_ipython()
75 def_colors = shell.colors
/home/nnn/anaconda/lib/python2.7/site-packages/traitlets/config/configurable.pyc in instance(cls, *args, **kwargs)
413 raise MultipleInstanceError(
414 ''Multiple incompatible subclass instances of ''
--> 415 ''%s are being created.'' % cls.__name__
416 )
417
MultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
El mismo error aparece si uso este código no en el cuaderno jupyter del navegador, sino en jupyter qtconsole. ¿Qué significa este error y qué hacer para evitarlo? ¿Es posible depurar el código en la celda paso a paso, usando los comandos next, continue, etc. del depurador pdb?
Mi versión de Jupyter es 5.0.0 y mi versión de ipython correspondiente es 6.1.0. estoy usando
import IPython.core.debugger
dbg = IPython.core.debugger.Pdb()
dbg.set_trace()
Tracer
aparece como obsoleto.
Actualizar:
Intenté usar el método de otra respuesta https://.com/a/43086430/8019692 continuación, pero obtuve un error:
MultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
Prefiero mi método a la magia de
depuración %%
ya que puedo establecer puntos de interrupción en funciones definidas en otras celdas y ejecutar la función en otra celda.
Jupyter / IPython cae en el depurador en mi función donde se establece el punto de interrupción, y puedo usar los comandos
pdb
habituales.
A cada uno lo suyo...
@ lugger1, la respuesta aceptada está en desuso.
Si usa Jupyter Notebook, comience su celda con el comando mágico " %% debug ". Luego, se mostrará una línea ipdb en la parte inferior de la celda que lo ayudará a navegar a través de la sesión de depuración. Los siguientes comandos deberían comenzar:
n - ejecuta la línea actual y pasa a la siguiente línea.
c - continuar la ejecución hasta el próximo punto de interrupción.
Asegúrese de reiniciar el núcleo cada vez que decida sobre la depuración, para que todas las variables se asignen recientemente. Puede verificar el valor de cada variable a través de la línea ipdb y verá que la variable no está definida hasta que ejecute la línea que asigna un valor a esa variable.
%%debug
import pdb
from pdb import set_trace as bp
def function_xyz():
print(''before breakpoint'')
bp() # This is a breakpoint.
print(''after breakpoint'')
También tenía este problema y parece estar relacionado con las versiones de jupyter e ipdb.
La solución es usar esto en lugar de la llamada set_trace de la biblioteca
set_trace
:
from IPython.core.debugger import Tracer
Tracer()() #this one triggers the debugger
Fuente: http://devmartin.com/blog/2014/10/trigger-ipdb-within-ipython-notebook/
Tracer()
está en desuso.
Utilizar:
from IPython.core.debugger import set_trace
y luego coloque
set_trace()
donde se necesita el punto de interrupción.
from IPython.core.debugger import set_trace
def add_to_life_universe_everything(x):
answer = 42
set_trace()
answer += x
return answer
add_to_life_universe_everything(12)
Esto funciona bien y nos brinda un poco más de comodidad (por ejemplo, resaltado de sintaxis) que solo usar el pdb incorporado.