Para mis necesidades de depuración, pdb
es bastante bueno. Sin embargo, sería mucho más genial (y útil) si pudiera entrar ipython
. ¿Es esto posible?
81
Hay un ipdb
proyecto que integra iPython en el pdb estándar, por lo que puede hacer lo siguiente:
import ipdb; ipdb.set_trace()
Es instalable a través del habitual pip install ipdb
.
ipdb
es bastante corto, por lo que en lugar de easy_installing también puede crear un archivo en ipdb.py
algún lugar de su ruta de 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)
ModuleNotFoundError: No module named 'IPython.Debugger'
,ModuleNotFoundError: No module named 'IPython.Shell'
yImportError: cannot import name 'ipapi'
ModuleNotFoundError: No module named 'IPython.Debugger'
,ModuleNotFoundError: No module named 'IPython.Shell'
yImportError: cannot import name 'ipapi'
breakpoint()
función entre en ipdb.En IPython 0.11, puede incrustar IPython directamente en su código de esta manera
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 ejecuta (elegí arbitrariamente ejecutarlo dentro de una sesión ipython existente. Anidar sesiones ipython como esta en mi experiencia puede hacer que se bloquee).
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
fuente
def f() : pass ; IPython.embed = f
para que laembed()
llamada sea un error, entonces Ctrl + DSi 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 usar ipdb
fuente
El equivalente de
import pdb; pdb.set_trace()
con IPython es algo como:
from IPython.ipapi import make_session; make_session() from IPython.Debugger import Pdb; Pdb().set_trace()
Es un poco detallado, pero es bueno saberlo si no tiene ipdb instalado. La
make_session
llamada es necesaria una vez para configurar el esquema de color, etc., y lasset_trace
llamadas se pueden realizar en cualquier lugar donde necesite interrumpir.fuente
Normalmente, cuando uso ipython, enciendo 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 obtengo una excepción, ipython detiene el programa dentro del depurador. Consulte el comando de ayuda para los comandos mágicos de ipython (% magic)
fuente
Me gusta simplemente pegar esta línea en mis scripts donde quiero establecer un punto de interrupción:
__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()
fuente
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 .
fuente
Las versiones más recientes de IPython proporcionan un mecanismo sencillo 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 utilícelo
ipshell()
siempre que desee colocarlo en un shell de IPython. Esto le permitirá incrustar (e incluso anidar) intérpretes de IPython en su código.fuente
De los documentos de IPython :
import IPython.ipapi namespace = dict( kissa = 15, koira = 16) IPython.ipapi.launch_new_instance(namespace)
lanzará un shell de IPython mediante programación. Obviamente, los valores en el
namespace
dict son solo valores ficticios; podría tener más sentido usarloslocals()
en la práctica.Tenga en cuenta que tiene que codificar esto en; no va a funcionar como lo
pdb
hace. Si eso es lo que quiere, la respuesta de DoxaLogos probablemente se parezca más a lo que está buscando.fuente
La forma más rápida y sencilla:
from IPython.Debugger import Tracer debug = Tracer()
Entonces solo escribe
debug()
donde quiera comenzar a depurar su programa.
fuente
ImportError: No module named 'IPython.Debugger'
en Python 3.4 / IPython 3Tuve que buscar en Google esto un par de veces en los últimos días, así que agregué una respuesta ... a veces es bueno poder ejecutar un script normalmente y solo ingresar a ipython / ipdb en los errores, sin tener que poner
ipdb.set_trace()
puntos de interrupción en el códigoipython --pdb -c "%run path/to/my/script.py --with-args here"
(primero
pip install ipython
ypip install ipdb
por supuesto)fuente
ipython --pdb -- ./path/to/my/script --with-args here
Esto es bastante simple:
ipython some_script.py --pdb
Necesita la instalación de iPython, generalmente esto funciona:
pip install ipython
Yo uso ipython3 en lugar de ipython, así que sé que es una versión reciente de Python.
Esto es fácil de recordar porque solo usa iPython en lugar de python y agrega --pdb al final.
fuente
Para obtener el REPL de IPython usando colores de terminal, tuve que hacer esto:
from IPython import start_ipython start_ipython()
https://ipython.readthedocs.io/en/stable/api/generated/IPython.html#IPython.start_ipython
fuente