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)