Python - Как поймать сломанную трубу - PullRequest
4 голосов
/ 30 июня 2011

Я только что узнал о 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 Ответ

4 голосов
/ 30 июня 2011

Поскольку вы пишете такой небольшой объем данных, все они буферизируются, и на самом деле ничего не записывается в канал до тех пор, пока файл не будет закрыт.Во время закрытия делается попытка записи данных в канал, что не удается, но ваше предложение try / исключением уже выполнено.Если вы сбрасываете стандартный вывод во время попытки / исключения, вы должны поймать ошибку.(Хотя, поскольку вы пишете в канал в предложении кроме, вы его не увидите!)

...