NB: я не пытался воспроизвести проблему, описанную ниже под Windows, или с версиями Python, отличными от 2.7.3.
Самый надежный способ вызвать эту проблему - пропустить вывод следующего теста script через :
(под bash
):
try:
for n in range(20):
print n
except:
pass
то есть:.
% python testscript.py | :
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
Мой вопрос:
Как я могу изменить тест script выше, чтобы избежать сообщения об ошибке при запуске script (показано в Unix/
bash
)?
(Как показывает тест script, ошибка не может быть захвачена с помощью try-except
.)
Приведенный выше пример, по общему признанию, очень искусственный, но иногда я сталкиваюсь с той же проблемой, когда вывод script моего канала передается через какое-то стороннее программное обеспечение.
Сообщение об ошибке, безусловно, безвредно, но оно смущает конечных пользователей, поэтому я хотел бы отключить его.
EDIT: Следующий script, который отличается от исходного выше, только тем, что он переопределяет sys.excepthook, ведет себя точно так же, как указано выше.
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