Python - 如何捕获断开的管道
我刚刚了解了SIGPIPE这个概念,然后又读了一些关于如何在Python中处理它的内容。
在多个来源中,我看到了一些信息,比如:如何在Python中处理断开的管道(SIGPIPE)?
假设读取数据的脚本退出了,那么所有的建议都说写入数据的脚本应该把它的写入操作放在一个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 个回答
5
因为你写的数据量很小,所以这些数据会先被暂时存储起来,实际上在你关闭文件之前并不会真的写入管道。在关闭文件的时候,系统会尝试把数据写入管道,但这个过程会失败,而你的try/except代码块已经执行完了。如果你在try/except中强制刷新标准输出(stdout),你应该能捕捉到这个错误。(不过,由于你在except代码块中写入管道,所以你是看不到这个错误的!)