Python 3.2 Idle与终端对比
在OSX的Python 3.2环境下,如果我在IDLE中运行“type(sys.stdin)”,我得到的结果很奇怪,如下所示:
>>> type(sys.stdin)
<class 'idlelib.rpc.RPCProxy'>
>>>
但是如果我在终端中重新运行同样的命令,我得到的是:
>>> import sys
>>> type(sys.stdin)
<class '_io.TextIOWrapper'>
>>>
我明白这是因为我在IDLE中运行的。但这不是让人困惑吗?
我试图在IDLE中运行以下命令,花了好几个小时想搞明白为什么不行。(我还是个Python新手)
>>> w = sys.stdin.readlines()
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
w = sys.stdin.readlines()
AttributeError: readlines
但我刚发现它在终端中运行得很好。
>>> w = sys.stdin.readlines()
wow
ww
wewew
>>>
>>> w
['wow\n', 'ww\n', 'wewew\n']
>>>
这算是个bug吗?
1 个回答
6
这是一个关于Python的已知问题:
http://bugs.python.org/issue9290
在IDLE环境中,sys.stdin是一个叫做
idlelib.rpc.RPCProxy
的东西,这导致在IDLE和命令行模式下,程序的表现会有所不同。我在给很多学生的作业打分时注意到了这一点。比如说:
sys.stdin.readlines()
在IDLE中,这些功能根本不存在,但在命令行模式下却可以正常使用。
在命令行模式中,sys.stdin是一个文件。
这其实是正常的,因为手册(27.1节)提到,sys.stdin(还有stdout和stderr)是“与解释器的标准输入对应的文件对象”。
此外,还有其他一些“怪癖”。
我觉得同一个程序在不同环境下,stdin的表现会有差异,这实在是太奇怪了。
需要注意的是,这个问题可能不会被修复,因为 readlines
通常并不是很有用。相反,你可以直接遍历文件对象本身:
for line in sys.stdin:
...