‘sys.excepthook’ y enhebrado

Estoy usando Python 2.5 y trato de usar una excepthook autodefinida en mi progtwig. En el hilo principal funciona perfectamente bien. Pero en un hilo iniciado con el módulo de excepthook se llama la excepthook habitual.

Aquí hay un ejemplo que muestra el problema. Descomentar el comentario muestra el comportamiento deseado.

 import threading, sys def myexcepthook(type, value, tb): print 'myexcepthook' class A(threading.Thread, object): def __init__(self): threading.Thread.__init__(self, verbose=True) # raise Exception('in main') self.start() def run(self): print 'A' raise Exception('in thread') if __name__ == "__main__": sys.excepthook = myexcepthook A() 

Entonces, ¿cómo puedo usar mi propio excepthook en un hilo?

Parece que este error todavía está presente en (al menos) 3.4, y una de las soluciones en la discusión que Nadia Alramli enlazó parece funcionar también en Python 3.4.

Para mayor comodidad y documentación, publicaré el código para (en mi opinión) la mejor solución aquí. Actualicé el estilo de encoding y los comentarios para que sea más PEP8 y Pythonic.

 import sys import threading def setup_thread_excepthook(): """ Workaround for `sys.excepthook` thread bug from: http://bugs.python.org/issue1230540 Call once from the main thread before creating any threads. """ init_original = threading.Thread.__init__ def init(self, *args, **kwargs): init_original(self, *args, **kwargs) run_original = self.run def run_with_except_hook(*args2, **kwargs2): try: run_original(*args2, **kwargs2) except Exception: sys.excepthook(*sys.exc_info()) self.run = run_with_except_hook threading.Thread.__init__ = init 

Parece que hay un error relacionado reportado aquí con soluciones provisionales. Los hacks sugeridos básicamente envuelven la ejecución en un try / catch y luego llaman a sys.excepthook(*sys.exc_info())