2009-05-17 28 views
7

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?

Odpowiedz

6

Według Wikipedii, z definicji demon powinien odłączyć się od kontrolującego tty, więc myślę, że to jest poprawne, że nie jest pokazywany żaden wyjątek (a przecież demon powinien nadal działać, nawet jeśli zamknie się powłokę, która go uruchomiła) ..
Zobacz here.

chodzi o jak wydrukować traceback, myślę, że prosty try/except_then_log_to_file by rade :)

+0

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