sheet notebook cheat python shell debugging ipython pdb

python - cheat - jupyter notebook markdown



¿Es posible ingresar a ipython desde el código? (11)

Para mis necesidades de depuración, pdb es bastante bueno. Sin embargo, sería mucho más ipython (y útil) si pudiera entrar en ipython . ¿Es esto posible?


De los documentos de IPython :

import IPython.ipapi namespace = dict( kissa = 15, koira = 16) IPython.ipapi.launch_new_instance(namespace)

lanzará un shell IPython programáticamente. Obviamente, los valores en el dict del namespace son solo valores ficticios; podría tener más sentido usar locals() en la práctica.

Tenga en cuenta que tiene que codificar esto; no va a funcionar como pdb hace pdb . Si eso es lo que quieres, la respuesta de DoxaLogos es probablemente más parecida a lo que estás buscando.


El equivalente de

import pdb; pdb.set_trace()

con IPython es algo así como:

from IPython.ipapi import make_session; make_session() from IPython.Debugger import Pdb; Pdb().set_trace()

Es un poco detallado, pero es bueno saber si no tiene instalado ipdb. La llamada make_session se requiere una vez para configurar el esquema de color, etc., y set_trace llamadas set_trace se pueden colocar en cualquier lugar que necesite romper.


En IPython 0.11, puede incrustar IPython directamente en su código como este

Su programa podría verse así

In [5]: cat > tmpf.py a = 1 from IPython import embed embed() # drop into an IPython session. # Any variables you define or modify here # will not affect program execution c = 2 ^D

Esto es lo que sucede cuando lo ejecutas (yo elegí arbitrariamente ejecutarlo dentro de una sesión de ipython existente. Anidar sesiones de ipython como esta en mi experiencia puede hacer que se cuelgue).

In [6]: In [6]: run tmpf.py Python 2.7.2 (default, Aug 25 2011, 00:06:33) Type "copyright", "credits" or "license" for more information. IPython 0.11 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython''s features. %quickref -> Quick reference. help -> Python''s own help system. object? -> Details about ''object'', use ''object??'' for extra details. In [1]: who a embed In [2]: a Out[2]: 1 In [3]: Do you really want to exit ([y]/n)? y In [7]: who a c embed


Hay un proyecto de ipdb que incorpora iPython en el pdb estándar, por lo que puede hacer:

import ipdb; ipdb.set_trace()

Se puede instalar a través de la instalación habitual de pip install ipdb .

ipdb es bastante corto, así que en lugar de easy_installing también puedes crear un archivo ipdb.py algún lugar de tu ruta Python y pegar lo siguiente en el archivo:

import sys from IPython.Debugger import Pdb from IPython.Shell import IPShell from IPython import ipapi shell = IPShell(argv=['''']) def set_trace(): ip = ipapi.get() def_colors = ip.options.colors Pdb(def_colors).set_trace(sys._getframe().f_back)


La manera rápida y fácil:

from IPython.Debugger import Tracer debug = Tracer()

Entonces solo escribe

debug()

donde quiera comenzar a depurar su programa.


Las versiones más recientes de IPython proporcionan un mecanismo fácil para incrustar y anidar sesiones de IPython en cualquier programa de Python. Puede seguir la siguiente receta para incrustar sesiones de IPython:

try: get_ipython except NameError: banner=exit_msg='''' else: banner = ''*** Nested interpreter ***'' exit_msg = ''*** Back in main IPython ***'' # First import the embed function from IPython.frontend.terminal.embed import InteractiveShellEmbed # Now create the IPython shell instance. Put ipshell() anywhere in your code # where you want it to open. ipshell = InteractiveShellEmbed(banner1=banner, exit_msg=exit_msg)

Luego use ipshell() siempre que quiera ingresar en un shell de IPython. Esto le permitirá incrustar (e incluso anidar) intérpretes de IPython en su código.


Me gusta simplemente pegar este guion en mis guiones donde quiero establecer un punto de quiebre:

__import__(''IPython'').Debugger.Pdb(color_scheme=''Linux'').set_trace()

La versión más nueva podría usar:

__import__(''IPython'').core.debugger.Pdb(color_scheme=''Linux'').set_trace()


Normalmente, cuando uso ipython, activo la depuración automática con el comando "pdb" dentro de él.

Luego ejecuto mi script con el comando "ejecutar myscript.py" en el directorio donde se encuentra mi script.

Si recibo una excepción, ipython detiene el programa dentro del depurador. Consulte el comando de ayuda para los comandos mágicos de ipython (% magic)


Parece que los módulos se han barajado un poco recientemente. En IPython 0.13.1, lo siguiente funciona para mí

from IPython.core.debugger import Tracer; breakpoint = Tracer() breakpoint() # <= wherever you want to set the breakpoint

Aunque, por desgracia, todo es bastante inútil en qtconsole .


Si está usando una versión más moderna de IPython (> 0.10.2), puede usar algo como

from IPython.core.debugger import Pdb Pdb().set_trace()

Pero probablemente sea mejor simplemente usar ipdb


Tuve que googlear esto un par de veces en los últimos días para agregar una respuesta ... a veces es bueno poder ejecutar un script normalmente y solo caer en ipython / ipdb en los errores, sin tener que poner los puntos de interrupción ipdb.set_trace() en el código

ipython --pdb -c "%run path/to/my/script.py --with-args here"

(Primero pip install ipython y pip install ipdb por supuesto)