Desde entonces he encontrado un trabajo alternativo, pero aún quiero saber la respuesta.¿Por qué no puedo recortar un Traceback de un error en Python?
Respuesta
El rastreo contiene referencias a los marcos de pila de cada función/método que se invocó en el hilo actual, desde el marco superior hasta el punto donde se produjo el error. Cada marco de pila también contiene referencias a las variables locales y globales vigentes en el momento en que se llamó a cada función de la pila.
Dado que no hay forma de que pickle sepa qué serializar y qué ignorar, si pudiera encuadrar un rastreo, terminaría decapando una instantánea en movimiento de todo el estado de la aplicación: mientras se ejecuta pickle, otros hilos puede estar modificando los valores de las variables compartidas.
Una solución es crear un objeto seleccionable para recorrer el rastreo y extraer solo la información que necesita guardar.
Gracias por la respuesta súper clara ... tiene sentido. Mi sueño de enviar LogRecord de forma transparente a través de la red se ha roto, pero ahora entiendo por qué no se puede hacer ... –
supongo que está interesado en ahorrar el contexto de la llamada completa (rastreo + globales + lugareños de cada cuadro).
Eso sería muy útil para determinar una diferencia de comportamiento de la misma función en dos contextos de llamada diferentes, o para construir sus propias herramientas avanzadas para procesar, mostrar o comparar esos registros.
El problema es que Pickl no sabe cómo serializar todo tipo de objetos que podrían estar en los locales o globals.
Supongo que puede construir su propio objeto y guardarlo, filtrando todos los objetos que no son picklabe. Este código puede servir como base:
import sys, traceback
def print_exc_plus():
"""
Print the usual traceback information, followed by a listing of all the
local variables in each frame.
"""
tb = sys.exc_info()[2]
while 1:
if not tb.tb_next:
break
tb = tb.tb_next
stack = []
f = tb.tb_frame
while f:
stack.append(f)
f = f.f_back
stack.reverse()
traceback.print_exc()
print "Locals by frame, innermost last"
for frame in stack:
print
print "Frame %s in %s at line %s" % (frame.f_code.co_name,
frame.f_code.co_filename,
frame.f_lineno)
for key, value in frame.f_locals.items():
print "\t%20s = " % key,
#We have to be careful not to cause a new error in our error
#printer! Calling str() on an unknown object could cause an
#error we don't want.
try:
print value
except:
print "<ERROR WHILE PRINTING VALUE>"
pero en lugar de la impresión de los objetos que se pueden añadir a una lista con su propia representación pickable (un JSON o yml formato podría ser mejor).
Quizás desee cargar todo este contexto de llamada para reproducir la misma situación para su función sin ejecutar el complicado flujo de trabajo que la genera. No sé si esto se puede hacer (debido a las referencias de memoria), pero en ese caso necesitaría deserializarlo de su formato.
Más aquí: http://code.activestate.com/recipes/52215-get-more-information- from-tracebacks / – yucer
- 1. ¿Por qué no puedo manejar un KeyboardInterrupt en python?
- 2. ¿Por qué no puedo extender bool en Python?
- 3. ¿Por qué no puedo causar un error seg?
- 4. cómo capturar un traceback en gevent
- 5. ¿Por qué no puedo usar operator.itemgetter en un multiprocesamiento.Pool?
- 6. ¿Por qué no puedo push_back un unique_ptr en un vector?
- 7. Python: ¿Por qué no puedo usar `super` en una clase?
- 8. ¿Por qué puedo actualizar un segmento de lista pero no un segmento de cadena en python?
- 9. ¿Por qué no puedo mostrar un carácter Unicode en Python Interpreter en Mac OS X Terminal.app?
- 10. ¿Cómo puedo reemplazar secuencias de espacios en blanco por un espacio pero no recortar en XSLT?
- 11. ¿Por qué no puedo dividir un datetime.timedelta por un flotante?
- 12. ¿Por qué no puedo multiplicar un flotador?
- 13. ¿Por qué no puedo "guardar como" un archivo Excel de mi código Python?
- 14. ¿Por qué obtengo un objeto no es un error iterable?
- 15. ¿Por qué no puedo definir un nuevo tipo en ghci?
- 16. ¿Por qué no puedo usar sizeof() en un #if?
- 17. ¿Por qué input() da un error cuando solo presiono enter?
- 18. ¿Por qué no puedo usar ttk en Python?
- 19. ¿Por qué no puedo establecer una variable global en Python?
- 20. ¿Por qué 'verdadero == no es falso' un error de sintaxis en Python?
- 21. ¿Por qué no puedo declarar un nombre de función "_"?
- 22. `inspect.trace()` `vs traceback`
- 23. ¿Por qué no puedo unbox un int como un decimal?
- 24. ¿Por qué no puedo ver un mensaje de error detallado en esta página aspx?
- 25. ¿Por qué no puedo leer más de 16 bytes de un archivo JPEG en Python?
- 26. Recortar un UIImage en iPhone
- 27. ¿Por qué no puedo hacer un vector de referencias?
- 28. ¿Por qué esto no da un tipo de error?
- 29. ¿por qué PHP no está arrojando un error de análisis?
- 30. ¿Por qué no puedo unirme a esta tupla en Python?
Luego debe explicar qué es exactamente lo que está tratando de hacer. Puede convertir su traceback en una cadena utilizando traceback.format_exec(). Las cadenas son eminentemente pickleable. – dusktreader
No me quejo necesariamente, pero me interesa saber por qué se votó negativamente. Fuera de 1) falta de investigación, 2) poco claro, o 3) no útil, supongo que elegiría (1) si tuviera que hacerlo, pero ¿eso significa que debería enumerar todos los resultados de Google y los libros que * no incluyeron? * contiene la respuesta que estaba buscando? – Trindaz
@Trindaz No he votado negativamente, pero si tuviera que adivinar la procedencia de los tres -1s, diría que se debió a la falta de detalles en su pregunta. ¿Por qué estás tratando de recuperar un rastreo? ¿Cuál fue el trabajo que encontraste? –