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