我刚刚学习了SIGPIPE,然后阅读了如何在Python中处理这些内容。
在其他来源中,我读过:How to handle a broken pipe (SIGPIPE) in python?
假设管道读取脚本退出,然后所有答案都表明编写脚本在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)
在shell中:
$ python printer.py | python nonreader.py
close failed in file object destructor:
Error in sys.excepthook:
Original exception was:
显然,没有抓到任何东西。此外,它看起来非常错误,当它打印'原始例外是:'然后没有更多。
出了什么问题/我误解了什么?
托马斯
答案 0 :(得分:4)
由于您正在编写如此少量的数据,因此它全部被缓冲,并且在文件关闭之前,实际上没有任何内容写入管道。在关闭期间,尝试将数据写入管道,但管道失败,但您的try / except子句已经完成。如果在try / except期间刷新stdout,则应该捕获错误。 (虽然,因为你在except子句中写入管道,所以你不会看到它!)