Jak uciszyć błąd „sys.excepthook brakuje”?
NB: Nie próbowałem odtworzyć problemu opisanego poniżej w systemie Windows lub wersji Pythona innych niż 2.7.3.
Najbardziej niezawodnym sposobem na rozwiązanie omawianego problemu jest przetransportowanie wyników następującego skryptu testowego:
(podbash
):
try:
for n in range(20):
print n
except:
pass
To znaczy.:
% python testscript.py | :
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
Moje pytanie brzmi:
Jak mogę zmodyfikować skrypt testowy powyżej aby uniknąć komunikatu o błędzie, gdy skrypt jest uruchamiany w pokazany sposób (w systemie Unix /bash
)?
(Jak pokazuje skrypt testowy, błędu nie można złapać za pomocą atry-except
.)
Powyższy przykład jest wprawdzie wysoce sztuczny, ale napotykam na ten sam problemczasami kiedy wyjście mojego skryptu jest przesyłane strumieniowo przez oprogramowanie innych firm.
Komunikat o błędzie jest z pewnością nieszkodliwy, ale jest niepokojący dla użytkowników końcowych, więc chciałbym go uciszyć.
EDYCJA: Poniższy skrypt, który różni się od oryginalnego powyżej tylko tym, że redefiniuje sys.excepthook, zachowuje się dokładnie tak, jak podano powyżej.
import sys
STDERR = sys.stderr
def excepthook(*args):
print >> STDERR, 'caught'
print >> STDERR, args
sys.excepthook = excepthook
try:
for n in range(20):
print n
except:
pass