2009-05-17 9 views
7

Python non stampa i messaggi di traceback dalle eccezioni generate nei thread del daemon.Stampa di eccezioni del thread demonico in Python

Ad esempio, questo codice crea un filo demoniaca e solleva un'eccezione nel nuovo thread:

def error_raiser(): 
    raise Exception 

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

ma non stampa un traceback. (Non dà output).

Tuttavia, se il thread non è impostato come thread daemon, Python stamperà il traceback. Ecco lo stesso codice con una linea commentata:

def error_raiser(): 
    raise Exception 

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

e l'output:

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 

esecuzione di questo codice sia Python 2.6.2 e 3.0.1 Python e dà gli stessi risultati. È interessante notare, tuttavia, che se eseguo il codice importandolo nella shell IPython, viene visualizzata l'eccezione se il thread è daemon o meno.

Secondo la documentazione, l'unico significato del flag 'daemon' è che "l'intero programma Python viene chiuso quando rimangono solo i thread del daemon." Questo mi farebbe credere che non si stampa un traceback dopo che un'eccezione è un bug in Python, a meno che non mi sia sfuggito qualcosa nella documentazione.

Si tratta di un errore o ho perso qualcosa nella documentazione e questo comportamento è intenzionale? Se è intenzionale, come posso forzare Python a stampare il traceback nei thread del daemon senza usare IPython?

risposta

6

Secondo Wikipedia, un demone dovrebbe staccarsi dal tty di controllo, quindi penso sia corretto che non venga mostrata alcuna eccezione (e dopo tutto, un demone dovrebbe continuare a funzionare anche se si chiude la shell che lo ha lanciato) ..
Vedere here.

Per quanto riguarda come stampare il traceback, penso che un semplice try/except_then_log_to_file farebbe il trucco :)

+0

La soluzione funziona alla grande per la stampa della traceback. Non ho pensato a una prova ... tranne perché dipendevo da Python per fare la stampa per me. A proposito, credo che un thread daemon sia terminato quando il programma esce, secondo la documentazione, invece di staccare semplicemente. Grazie per il vostro aiuto! –