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/ исключением уже выполнено. Если вы сбрасываете стандартный вывод во время попытки / исключения, вы должны поймать ошибку. (Хотя, поскольку вы пишете в канал в предложении кроме, вы не увидите его!)

Другие вопросы по тегам