0

我希望 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。

4

0 回答 0