Python 3.2 Idle与终端对比

4 投票
1 回答
2505 浏览
提问于 2025-04-16 18:59

在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:
    ...

撰写回答