2009-05-17 10 views
7

Python no imprime mensajes de rastreo de excepciones generadas en subprocesos de daemon.Impresión de excepciones de subproceso demoníaco en Python

Por ejemplo, este código crea un hilo daemonic y lanza una excepción en el nuevo hilo:

def error_raiser(): 
    raise Exception 

import threading 
thread = threading.Thread(target=error_raiser) 
thread.daemon = True 
thread.start() 

pero no imprime un rastreo. (No da salida).

Sin embargo, si el subproceso no está configurado como un subproceso de demonio, Python imprimirá la trazabilidad. Aquí es el mismo código con una línea comentada:

def error_raiser(): 
    raise Exception 

import threading 
thread = threading.Thread(target=error_raiser) 
# thread.daemon = True 
thread.start() 

y la salida:

Exception in Thread-1: 
Traceback (most recent call last): 
    File "C:\Python26\lib\threading.py", line 525, in __bootstrap_inner 
    self.run() 
    File "C:\Python26\lib\threading.py", line 477, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "test.py", line 2, in error_raiser 
    raise Exception 
Exception 

ejecución de este código, tanto en Python 2.6.2 y Python 3.0.1 y da los mismos resultados. Curiosamente, sin embargo, si ejecuto el código importándolo en el shell de IPython, la excepción se muestra si el hilo es daemonic o no.

De acuerdo con la documentación, el único significado de la bandera 'daemon' es que "todo el programa Python se cierra cuando solo quedan hilos daemon". Esto me haría creer que no imprimir un rastreo después de una excepción es un error en Python, a menos que omita algo en la documentación.

¿Esto es un error, o he omitido algo en la documentación y este comportamiento es intencional? Si es intencional, ¿cómo puedo forzar a Python a imprimir la trazabilidad en hilos daemon sin usar IPython?

Respuesta

6

De acuerdo con Wikipedia, por definición, un daemon debe separarse de la tty controladora, así que creo que es correcto que no se muestre ninguna excepción (y después de todo, un daemon debería seguir funcionando incluso si cierra el shell que lo lanzó) ..
Ver here.

En cuanto a cómo imprimir el rastreo, creo que una oportunidad sencilla/except_then_log_to_file haría el truco :)

+0

Su solución funciona muy bien para imprimir el rastreo. No pensé en intentarlo ... excepto porque dependía de Python para hacer la impresión por mí. Por cierto, creo que un hilo daemonic termina cuando sale el programa, de acuerdo con la documentación, en lugar de simplemente separar. ¡Gracias por su ayuda! –