Python nie drukuje komunikatów traceback od wyjątków wywoływanych w wątkach demonów.Drukowanie wyjątków wątków demonów w języku Python
Na przykład ten kod tworzy demoniczną wątek i podnosi wyjątek w nowym wątku:
def error_raiser():
raise Exception
import threading
thread = threading.Thread(target=error_raiser)
thread.daemon = True
thread.start()
ale nie drukuje traceback. (Nie daje wyjścia).
Jeśli jednak wątek nie jest ustawiony jako wątek demona, Python wydrukuje traceback. Oto ten sam kod w jednej linii wykomentowane:
def error_raiser():
raise Exception
import threading
thread = threading.Thread(target=error_raiser)
# thread.daemon = True
thread.start()
i wyjście:
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
Wykonanie tego kodu zarówno Python 2.6.2 i Python 3.0.1 i daje takie same wyniki. Co ciekawe jednak, jeśli wykonam kod przez zaimportowanie go w powłoce IPython, zostanie wyświetlony wyjątek, czy wątek jest demoniczny czy nie.
Zgodnie z dokumentacją, jedynym znaczeniem flagi "demon" jest to, że "cały program Pythona kończy działanie, gdy pozostaną tylko wątki demona." To sprawiłoby, żebym uwierzył, że nie drukowanie tracebacka po wyjściu jest błędem w Pythonie, chyba że coś przeoczyłem w dokumentacji.
Czy to błąd, czy też brakowało mi czegoś w dokumentacji i takie zachowanie jest zamierzone? Jeśli jest to celowe, w jaki sposób mogę zmusić Pythona do drukowania informacji zwrotnej w wątkach demonów bez używania IPython?
Twoje rozwiązanie działa świetnie do drukowania traceback. Nie myślałem o próbie ... z wyjątkiem tego, że byłem zależny od Pythona, żeby wydrukować dla mnie. Nawiasem mówiąc, wierzę, że wątek demoniczny jest kończony, gdy program wychodzi, zgodnie z dokumentacją, zamiast po prostu odłączać. Dzięki za pomoc! –