【发布时间】:2014-12-28 19:30:56
【问题描述】:
问题:有没有办法在不获取BrokenPipeError 的情况下将flush=True 用于print() 函数?
我有一个脚本pipe.py:
for i in range(4000):
print(i)
我在 Unix 命令行中这样称呼它:
python3 pipe.py | head -n3000
然后它返回:
0
1
2
这个脚本也是如此:
import sys
for i in range(4000):
print(i)
sys.stdout.flush()
但是,当我运行此脚本并将其传送到 head -n3000:
for i in range(4000):
print(i, flush=True)
然后我得到这个错误:
print(i, flush=True)
BrokenPipeError: [Errno 32] Broken pipe
Exception BrokenPipeError: BrokenPipeError(32, 'Broken pipe') in <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> ignored
我也尝试了下面的解决方案,但我仍然得到BrokenPipeError:
import sys
for i in range(4000):
try:
print(i, flush=True)
except BrokenPipeError:
sys.exit()
【问题讨论】:
-
我无法在 OS X 10.10 上重现它,现在尝试 centOS 6.6。
-
我刚刚在 OS X 10.9.4 上尝试过,但无法重现它。我在 Ubuntu 12.04.2 LTS 上遇到错误。我会在 Linux Mint Qiana 上尝试。
-
你所有的脚本都为我打断了,除了第一个......
-
我无法通过在 Python 3.4.1 中运行您的脚本来重现异常。您使用的是哪个 Python 版本?
-
我在 Mac OS X 10.9.4 上尝试了 3.4.1 版本,在 Ubuntu 12.04.2 LTS 上尝试了 3.3.2 版本。我目前无法自己重现该错误。我不得不将 range(4) 更改为 range(4000) 并将 head -n3 更改为 head -n3000 以重现错误。
标签: python unix python-3.x flush broken-pipe