The BrokenPipeError
正如幻象所说,这是正常的,因为读取进程(head)终止并关闭其管道末端,而写入进程(python)仍然尝试写入。
Is is异常情况,并且 python 脚本收到BrokenPipeError
- 更准确地说,Python 解释器收到一个系统 SIGPIPE 信号,它捕获并引发BrokenPipeError
允许脚本处理错误。
并且您可以有效地处理错误,因为在上一个示例中,您只看到一条消息,指出异常已被忽略 - 好吧,这不是真的,但似乎与此相关开放问题 http://bugs.python.org/issue11380,#msg153320in Python :Python 开发人员认为警告用户异常情况很重要。
真正发生的是,据我所知,Python 解释器总是在 stderr 上发出信号,即使你捕获了异常。但是您只需在退出之前关闭 stderr 即可删除该消息。
我将你的脚本稍微更改为:
- 正如您在上一个示例中所做的那样捕获错误
- 捕获 IOError(我在 Windows 64 上的 Python34 中遇到的)或 Broken Pipe Error(在 FreeBSD 9.0 上的 Python 33 中遇到的) - 并显示一条消息
- 显示自定义Donestderr 上的消息(由于管道损坏,stdout 已关闭)
-
关闭标准错误在退出之前删除该消息
这是我使用的脚本:
import sys
try:
for i in range(4000):
print(i, flush=True)
except (BrokenPipeError, IOError):
print ('BrokenPipeError caught', file = sys.stderr)
print ('Done', file=sys.stderr)
sys.stderr.close()
这里的结果是python3.3 pipe.py | head -10
:
0
1
2
3
4
5
6
7
8
9
BrokenPipeError caught
Done
如果您不想要无关的消息,只需使用:
import sys
try:
for i in range(4000):
print(i, flush=True)
except (BrokenPipeError, IOError):
pass
sys.stderr.close()