在python中使用Unicode进行奇怪的stdin缓冲

时间:2013-09-30 00:26:30

标签: python unicode utf-8 stdin buffering

我希望Python从stdin读取utf-8并使用可选的重定向将utf-8写入stdout。这就是我的代码:

#!/usr/bin/python
# echo.py

import sys
import codecs

so = codecs.getwriter('utf8')(sys.stdout)
si = codecs.getreader('utf8')(sys.stdin)

while True:
    t = si.readline()
    if len(t) <= 1: break
    so.write(t)
    so.flush()
so.write('\n')

如果我使用示例utf-8文件中的文本运行此结果,则结果符合预期:

$ python echo.py < sample
my résumé
來去 now
┬ ─ │ └

$

没关系。但是,当stdin获取从终端输入的相同样本文本时,输入行不会立即回显,并且单个control-D不会被识别为EOF。

$ python echo.py
my résumé
來去 now
┬ ─ │ └

^D

^CTraceback (most recent call last):
  File "./echo.py", line 10, in <module>
    t = si.readline()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/codecs.py", line 530, in readline
    data = self.read(readsize, firstline=True)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/codecs.py", line 473, in read
    newdata = self.stream.read(size)
KeyboardInterrupt

然而,两个连续的控制-D被识别为EOF。

$ python echo.py
my résumé
來去 now
┬ ─ │ └
my résumé
來去 now
┬ ─ │ └

$

命令行后的前3行是输入输入;接下来的3个回应。

如果我将相同的终端输入传输到stdin,回显仍然不是立即的,但在单个控件-D上,所有内容最终都显示在stdout上。

$ cat - | python echo.py

my résumé
來去 now
┬ ─ │ └

my résumé
來去 now
┬ ─ │ └

$

这里有什么建议吗?我在Mac OS X 10.8.5(Mountain Lion)下运行Python 2.7.5。

0 个答案:

没有答案