Encontrar el nombre del módulo de la excepción de origen en Python

Ejemplo:

>>> try: ... myapp.foo.doSomething() ... except Exception, e: ... print 'Thrown from:', modname(e) Thrown from: myapp.util.url 

En el ejemplo anterior, la excepción fue lanzada al módulo myapp / util / url.py. ¿Hay alguna manera de obtener el __name__ de ese módulo?

Mi intención es usar esto en la función logging.getLogger .

Esto debería funcionar:

 import inspect try: some_bad_code() except Exception, e: frm = inspect.trace()[-1] mod = inspect.getmodule(frm[0]) print 'Thrown from', mod.__name__ 

EDIT: Stephan202 menciona un caso de la esquina. En este caso, creo que podríamos predeterminar el nombre del archivo.

 import inspect try: import bad_module except Exception, e: frm = inspect.trace()[-1] mod = inspect.getmodule(frm[0]) modname = mod.__name__ if mod else frm[1] print 'Thrown from', modname 

El problema es que si el módulo no se carga (porque se lanzó una excepción al leer el código en ese archivo), entonces la llamada inspect.getmodule devuelve Ninguna. Por lo tanto, solo usamos el nombre del archivo al que hace referencia el marco ofensivo. (¡Gracias por señalar esto, Stephan202!)

Puede usar el módulo de sys.exc_info() , junto con sys.exc_info() , para obtener el rastreo de manera programática:

 try: myapp.foo.doSomething() except Exception, e: exc_type, exc_value, exc_tb = sys.exc_info() filename, line_num, func_name, text = traceback.extract_tb(exc_tb)[-1] print 'Thrown from: %s' % filename 

Esto debería funcionar:

 import inspect def modname(): t=inspect.trace() if t: return t[-1][1] 

El paquete de registro de Python ya es compatible con esto, verifique la documentación . Solo tiene que especificar %(module)s en la cadena de formato. Sin embargo, esto le proporciona el módulo donde se detectó la excepción, no necesariamente el mismo en el que se generó . El rastreo, por supuesto, le da la ubicación precisa donde se generó la excepción.

Tengo una historia sobre cómo CrashKit calcula los nombres de clase y de paquete de los seguimientos de stack de Python en el blog de la empresa: ” Python stack trace saga “. Código de trabajo incluido.