我希望 Python 从标准输入读取 utf-8 并将 utf-8 写入标准输出,并带有可选的重定向。这就是我的代码的样子:
#!/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
然而,两个连续的 control-D 被识别为 EOF。
$ python echo.py
my résumé
來去 now
┬ ─ │ └
my résumé
來去 now
┬ ─ │ └
$
命令行后的前 3 行是键入输入;接下来的 3 个被回显。
如果我将相同的终端输入通过管道传输到标准输入,回显仍然不是立即的,但是在单个 control-D 上,所有内容最终都会显示在标准输出上。
$ cat - | python echo.py
my résumé
來去 now
┬ ─ │ └
my résumé
來去 now
┬ ─ │ └
$
这里有什么建议吗?我在 Mac OS X 10.8.5 (Mountain Lion) 下运行 Python 2.7.5。