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?
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! –