2011-11-03 15 views
6

Recientemente cambié de ipython0.10 a ipython0.11. En ipython0.11, solo veo un pequeño fragmento del rastreo completo cuando el depurador de python se activa (es decir, usando %pdb), mientras que en ipython0.10 veo el rastreo completo. Por lo que puedo decir, no se puede acceder directamente a la traza completa desde la línea de comando pdb; puede navegar a través de ella con 'u' pero no puede verla directamente.depurador ipython: rastreo completo en pdb interactivo?

Entonces, ¿hay alguna manera de mostrar la trazabilidad completa? Tal como un parámetro de configuración?

O, lo que es más útil, ¿hay alguna manera de que ipython solo muestre la excepción capturada, en lugar de mostrar en qué parte del código fue capturado?

EDIT: Ejemplo:

In [1]: pdb 
Automatic pdb calling has been turned ON 

In [2]: 1/0 
> <ipython-input-2-05c9758a9c21>(1)<module>() 
    -1 1/0 

ipdb> q 
--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 
/Users/adam/<ipython-input-2-05c9758a9c21> in <module>() 
----> 1 1/0 

ZeroDivisionError: integer division or modulo by zero 

me gustaría ver el ZeroDivisionError antesq 'ing fuera de la AP.

+1

Este es un error en IPython 0.11 - el rastreo se imprime después de salir del depurador, en lugar de antes de que comience. Se fijará para 0.12 (que debería estar disponible antes de Navidad). –

Respuesta

6

¿Hay alguna forma de que ipython muestre la excepción que fue atrapada, en lugar de mostrar en qué parte del código fue capturado?

Usted podría utilizar sys.excepthook:

import sys 

def exc_hook(type, value, traceback): 
    print type 

sys.excepthook = exc_hook 

Desde el sys module documentation:

sys.excepthook(type, value, traceback)

Esta función imprime un rastreo y la excepción que se da a sys.stderr.

Cuando se produce una excepción y no se detecta, el intérprete llama a sys.excepthook con tres argumentos, la clase de excepción, la excepción instancia y un objeto de rastreo. En una sesión interactiva, esto ocurre justo antes de que se devuelva el control al aviso; en un programa Python esto ocurre justo antes de que el programa salga. El manejo de tales excepciones de nivel superior se puede personalizar asignando otra función de tres argumentos a sys.excepthook.

sys.__displayhook__
sys.__excepthook__

Estos objetos contienen los valores originales de displayhook y excepthook al inicio del programa. Se guardan para que displayhook y exceptionthook se puedan restaurar en caso de que se reemplacen por objetos rotos.


También puede intentar iniciar ipython con la opción de establecer --xmode a Plain

De IPython reference:

$ ipython [options] files 

--xmode=<modename> 

modo de informes de excepción.

Modos válidos: Normal, Contexto y Detallado.

Normal: similar a la impresión de rastreo normal de python.

Contexto: imprime 5 líneas de código fuente de contexto alrededor de cada línea en la traza.

detallado: similar al contexto, pero, además, imprime las variables actualmente visible, donde ocurrió la excepción (acortando sus cadenas si son demasiado largos). Esto puede ser muy lento, si sucede que tiene una enorme estructura de datos cuya representación de cadena es compleja para calcular. Es posible que su computadora parezca congelarse por un tiempo con el uso de la CPU al 100%. Si esto ocurre, puede cancelar el rastreo con Ctrl-C (tal vez presionarlo más de una vez).

Aquí hay algunos ejemplos de usos. Nótese la diferencia en las líneas por cada rastreo:

--xmode=Plain:

[ 19:55 [email protected] ~/SO/python ]$ ipython --xmode=Plain ipython-debugger-full-traceback-on-interactive-pdb.py 
------------------------------------------------------------ 
Traceback (most recent call last): 
    File "ipython-debugger-full-traceback-on-interactive-pdb.py", line 2, in <module> 
    1/0 
ZeroDivisionError: integer division or modulo by zero 

--xmode=Context:

[ 19:55 [email protected] ~/SO/python ]$ ipython --xmode=Context ipython-debugger-full-traceback-on-interactive-pdb.py 
--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 

/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>() 
     1 
----> 2 #!/usr/bin/python 
     3 1/0 
     4 
     5 

ZeroDivisionError: integer division or modulo by zero 

--xmode=Verbose:

[ 19:54 [email protected] ~/SO/python ]$ ipython --xmode=Verbose ipython-debugger-full-traceback-on-interactive-pdb.py 
--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 

/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>() 
     1 
----> 2 #!/usr/bin/python 
     3 1/0 
     4 
     5 

ZeroDivisionError: integer division or modulo by zero 

y sin especificar un archivo .py:

--xmode=Plain:

[ 19:55 [email protected] ~/SO/python ]$ ipython --xmode=Plain 

In [1]: 1/0 
------------------------------------------------------------ 
Traceback (most recent call last): 
    File "<ipython console>", line 1, in <module> 
ZeroDivisionError: integer division or modulo by zero 

--xmode=Context:

[ 20:03 [email protected] ~/SO/python ]$ ipython --xmode=Context 

In [1]: 1/0 
--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 

/home/jon/SO/python/<ipython console> in <module>() 

ZeroDivisionError: integer division or modulo by zero 

--xmode=Verbose:

[ 20:01 [email protected] ~/SO/python ]$ ipython --xmode=Verbose 


In [1]: 1/0 
--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 

/home/jon/SO/python/<ipython console> in <module>() 

ZeroDivisionError: integer division or modulo by zero 

Using the Python debugger.

+0

La segunda parte de su mensaje (--xmode) parece ser la respuesta, pero parece que no funciona. Probé los 3 nombres de modo y todos los tracebacks se ven iguales. ¿Alguna idea de lo que está causando eso? – keflavich

+1

Ver mis ediciones arriba. – chown

+0

Gracias. Desafortunadamente, eso señala lo que presumiblemente es un error en (¿mi copia de?) Ipython: '$ ipython --xmode = Normal ADVERTENCIA: Alias ​​no reconocido: 'xmode', probablemente no tendrá ningún efecto. Sin embargo, una vez en ipython : 'En [1]:% xmode Modo de informe de excepción: llano' funciona bien – keflavich

Cuestiones relacionadas