2010-02-19 9 views
20

Estoy trabajando en un proyecto bastante complejo y una y otra vez tengo que reducir los problemas al buscar en los rastreos de la pila. Resulta que son muy largos e involucran "mi" código, código de biblioteca estándar y código de bibliotecas de terceros al mismo tiempo. La mayoría de las veces, el verdadero problema está en "mi" código y localizarlo instantáneamente en un rastro de pila es un poco difícil para los ojos. En "mi" código quiero decir el código que está bajo el directorio de trabajo actual.Resaltando las trazas de la pila de python

Me di cuenta de que quería algo que coloreara los restos de la pila y resaltara las líneas que son mías. Comparar original a highlighted.

podría escribir un script en Python que podría utilizar de esta manera:

nosetests | colorize_stack_trace.py 

Pero creo que hay una manera más rápida y más elegante de hacer esto utilizando el conjunto de herramientas de Linux. ¿Algunas ideas?

UPD:

Usando supercat sugerido por Dennis Williamson, el resultado intermedio está siguiendo función bash:

pyst() { 
    rc=/tmp/spcrc; 
    echo '#################### ### # # # ########################################' > $rc; 
    echo '      blk 0 r ^(.*)$' >> $rc; 
    echo '      mag b 0 r ^\s*File "'`pwd`'/(.*)"' >> $rc; 
    spc -c $rc; 
} 

ahora que puedo hacer:

nosetests 2>&1 | pyst 
No

demasiado elegante, pero funciona en cierto grado. Quedan dos problemas:

  1. No puedo ver ninguna salida antes de que finalice la prueba de nariz. Es decir. No veo el progreso.
  2. Tengo que escribir 2> & 1 una y otra vez.

UPD 2:

Hacerse esta pregunta que tenía principalmente nosetests en mente. Y acabo de encontrar una gran solución: rednose complemento de la nariz. Destaca los caminos que son locales y hace muchas cosas más prácticas de legibilidad.

Volviendo a la pregunta original: los problemas que noté con supercat no se relacionan por completo, pero es un problema de transmisión de shell Unix, enrojecimiento, tuberías, redirección. Entonces, como respuesta a la pregunta preguntado acepto una respuesta que sugiere supercaptura.

+0

rednose es agradable. Puede tenerlo habilitado por defecto agregando 'rednose = 1' a su' .noserc' –

Respuesta

6

Tome un vistazo a Supercat (SPC). Tiene resaltado ANSI y HTML y se puede configurar para su salida particular. Viene con algunos archivos de configuración para archivos de código fuente en C y Python, por ejemplo, archivos de registro, registros de cambios, diffs y otros.

Basado en sugerencia de de Dave Kirby para vim, esto hace algo similar:

less -p regex file_name 

O

some_command | less -p regex 
1

Quizás podría usar el módulo cgitb (documento oficial corto here) como punto de partida (crea agradables trazas de HTML). Debería ser relativamente simple hacer las modificaciones que necesita (por ejemplo, agregar una etiqueta de color de acuerdo con la ruta del archivo). Pero, por supuesto, esto solo es viable si está dispuesto a usar el navegador para ver los rastros.

+0

Gracias por la pista, pero es un poco extraño usar el navegador para ver los resultados de las pruebas. Huele a script de acción y QUnit. No es tan flexible como puede ser :) – nkrkv

+0

@nailxx Es posible que desee ver más a fondo. Del documento oficial: 'Originalmente fue diseñado para mostrar información extensa de rastreo en HTML para scripts CGI. Más tarde se generalizó para mostrar también esta información en texto sin formato. –

0

Como punto de partida para colorear (y formatear de otro modo) el texto, es probable que desee consultar el curses library. También vea this how-to, que parece útil.

En cuanto a anular el manejo de errores integrado de Python para todos los programas ... Nunca lo intenté, pero creo que eso implicaría algunos cambios de bajo nivel. Siempre puedes envolver tu código en un gran bloque try/except, pero supongo que no quieres hacer eso.Estoy a favor del enfoque más Unixy de escribir un pequeño guión que hace una cosa, y lo hace bien: hacer que tome una entrada y, si es un rastro de pila, colorearlo. De lo contrario, pase el texto sin cambios. Usar una tubería, como sugirió, puede ser la mejor manera. (En este caso, en stderr tubería que te gustaría hacer algo como esto, que se fusiona con la salida estándar stderr antes del conexionado: cmd1 2>&1 | cmd2)

-1

Cargar el texto en vim:

nosetests | vim - 

Conjunto vim resalta todas las líneas que coinciden con una búsqueda

:set hlsearch 

Búsqueda de líneas con "su" camino

/.*/path/to/my/code.* 

Voila - se resaltará todas las líneas con su camino.

Si desea resaltar la siguiente línea, así entonces usted puede hacer eso también:

/.*/path/to/my/code.*\n.* 
20

En realidad, hay una gran biblioteca sintaxis de Python destacando llamada Pygments, que también es capaz de poner de relieve los rastreos. Aquí hay un example (el pastebin aquí usa Pygments).

Por lo tanto, todo lo que tiene que hacer es:

$ easy_install pygments # downloads and installs pygments 
$ cat traceback.txt | pygmentize -l pytb 

"pytb" es el atajo para la PythonTracebackLexer. También hay un lexer especial para Python 3 Tracebacks incluido, que se llama "py3tb".

Puede formatear la salida en varios formatos (incluidos html, latex, svg, varios formatos de imagen, etc.). Pero también hay un formateador de terminal disponible que podría tener este aspecto (y si se preguntan ... por supuesto que hay diferentes temas de colores disponibles!):

Pygments Console Traceback Highlighting http://www.tux21b.org/public/pygments-pytb.png

Usted puede utilizar -f html para seleccionar otro formateador (en ese caso, el formateador HTML).

Saludos,
Christoph

+0

Opción Cool, puede ser una buena alternativa a spc – nkrkv

+0

+1 para Pygments. Son las rodillas de la abeja. – jathanism

+2

¿Hay alguna forma de que python coloree las trazas mágicamente, sin conectar nada a ninguna otra herramienta? – azmeuk

0

También se puede abrir el archivo de rastreo con vim, utilizando :cfile comando. A continuación, puede abrir la lista de archivos interactiva destacada de los archivos en traceback usando el comando :copen y saltar entre estos archivos usando un conjunto de comandos vim relacionados.

0

Existe un módulo bueno sólo para ese propósito:

Sólo tienes que descargar e instalar a través de pepita:

pip install colored-traceback 

importación en un archivo de nivel superior de su proyecto, por ejemplo e así:

if DEBUG: 
    import colored_traceback 
    colored_traceback.add_hook() 

y se obtiene un rastreo igual que la de todos los archivos subordinado (colores puede variar):

Traceback (most recent call last): 
    File "./workflowy.py", line 525, in <module> 
    main() 
    File "./workflowy.py", line 37, in main 
    projects = cli.load_json(args, input_is_pipe) 
    File "./workflowy.py", line 153, in load_json 
    return json.load(sys.stdin) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 290, in load 
    **kw) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 383, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 
Cuestiones relacionadas