【问题标题】:Python 3.2 Idle vs terminalPython 3.2 空闲与终端
【发布时间】:2011-06-06 02:54:30
【问题描述】:

在 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']
>>> 

这是一个错误吗?

【问题讨论】:

  • 工作方法是使用w = list(sys.stdin),它将始终有效。而且我认为这是一个错误——sys.stdin 应该实现io.IOBase 的接口。
  • 这也发生在 Python 2.7 中
  • 它发生在所有版本的 IDLE 中,至少自从引入 readlines 以来。不幸的是,正如下面引用的开放错误所指出的,IDLE 的 stdinstdoutstderr 代理的实现并不完整且不是最新的。

标签: python python-idle


【解决方案1】:

这是一个提交的 Python 错误:

http://bugs.python.org/issue9290

IDLE 中的 sys.stdin 是一个 idlelib.rpc.RPCProxy 导致 具有不同行为的程序 IDLE 和命令行模式。

我注意到在给很多人评分时 学生在 IDLE 中练习。事物 喜欢:

sys.stdin.readlines()

只是在 IDLE 中不存在,但 在命令行中完全可操作 模式。

在命令行模式下,sys.stdin 是 文件。

这是预期的,如手册 (27.1) 说 sys.stdin (和标准输出和 stderrr) 是“文件对象 对应译者的 标准输入”

还有其他“怪癖”。

我跌倒了,这真的很奇怪 stdin 有不同的行为 相同的程序。


请注意,这可能不是固定的,因为readlines 通常没有用处。相反,您可以只遍历文件对象本身:

for line in sys.stdin:
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-05
    • 2011-07-20
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多