Python - Как поймать сломанную трубу
Я только что узнал о SIGPIPE, а затем прочитал о том, как обрабатывать их в Python.
Среди других источников я прочитал: Как обработать сломанную трубу (SIGPIPE) в Python?
Допустим, что скрипт чтения канала завершается, тогда все ответы предполагают, что сценарий записи переносит свои вызовы write в предложение try.
Однако я не могу заставить эту работу. Это мой код:
# printer.py
import time
try:
for i in range(10):
time.sleep(1)
print i
except:
print 'We caught the problem'
а также
#nonreader.py
#read nothing, but stay alive for 5 sec
import time, sys
time.sleep(5)
sys.exit(0)
И в оболочке:
$ python printer.py | python nonreader.py
close failed in file object destructor:
Error in sys.excepthook:
Original exception was:
Очевидно, ничего не было поймано. И, кроме того, это выглядит действительно неправильно, когда печатается "Первоначальное исключение было:", а затем не более.
Что не так / что я не так понял?
Томас
1 ответ
Поскольку вы пишете такой небольшой объем данных, все они буферизуются, и на самом деле ничего не записывается в канал до тех пор, пока файл не будет закрыт. Во время закрытия делается попытка записи данных в канал, что не удается, но ваше предложение try/ исключением уже выполнено. Если вы сбрасываете стандартный вывод во время попытки / исключения, вы должны поймать ошибку. (Хотя, поскольку вы пишете в канал в предложении кроме, вы не увидите его!)