e.printStackTrace equivalente en python

Sé que print(e) (donde e es una excepción) imprime la excepción ocurrida, pero estaba tratando de encontrar el equivalente en python de e.printStackTrace() de Java que rastrea exactamente la excepción a la línea en la que ocurrió e imprime todo el trazado. de eso

¿Podría alguien decirme el equivalente de e.printStackTrace() en Python?

 import traceback traceback.print_exc() 

Al hacer esto dentro de un bloque except ...: se usará automáticamente la excepción actual. Consulte http://docs.python.org/library/traceback.html para obtener más información.

También hay logging.exception .

 import logging ... try: g() except Exception as ex: logging.exception("Something awful happened!") # will print this message followed by traceback 

Salida:

 ERROR 2007-09-18 23:30:19,913 error 1294 Something awful happened! Traceback (most recent call last): File "b.py", line 22, in f g() File "b.py", line 14, in g 1/0 ZeroDivisionError: integer division or modulo by zero 

(De http://blog.tplus1.com/index.php/2007/09/28/the-python-logging-module-is-much-better-than-print-statements/ a través de Cómo imprimir el rastreo completo sin detener el progtwig? )

e.printStackTrace equivalente en python

En Java, esto hace lo siguiente ( docs ):

 public void printStackTrace() 

Imprime este lanzable y su retroceso al flujo de error estándar …

Esto se usa así:

 try { // code that may raise an error } catch (IOException e) { // exception handling e.printStackTrace(); } 

En Java, la secuencia de error estándar no tiene búfer, por lo que la salida llega inmediatamente.

La misma semántica en Python 2 es:

 import traceback import sys try: # code that may raise an error pass except IOError as e: # exception handling # in Python 2, stderr is also unbuffered print >> sys.stderr, traceback.format_exc() # in Python 2, you can also from __future__ import print_function print(traceback.format_exc(), file=sys.stderr) # or as the top answer here demonstrates, use: traceback.print_exc() # which also uses stderr. 

Python 3

En Python 3, podemos obtener el rastreo directamente del objeto de excepción (que probablemente se comporte mejor para el código de subprocesos). Además, stderr tiene búfer de línea , pero la función de impresión obtiene un argumento de color, por lo que esto se imprimirá inmediatamente a stderr:

  print(traceback.format_exception(None, # <- type(e) by docs, but ignored e, e.__traceback__), file=sys.stderr, flush=True) 

Conclusión:

Por lo tanto, en Python 3, traceback.print_exc() , aunque usa sys.stderr de forma predeterminada , amortiguaría la salida y es posible que la pierda. Entonces, para obtener la semántica más equivalente posible, en Python 3, use print con flush=True .