如果给定缓冲区长度,则python os.sys.stdin.buffer.read失败
失败于如果给定缓冲区长度,则python os.sys.stdin.buffer.read失败,python,windows,python-3.3,Python,Windows,Python 3.3,失败于 import os s = os.sys.stdin.buffer.read(1024*32) 如果运行pythont1.py,那么进程将被阻塞并按预期等待输入。 为什么python3.3有1024*32-1缓冲区长度限制?是系统不同,还是所有系统都相同?我们如何才能消除这一限制 顺便说一句:我使用windows 7 python 32位版本3.3,我们从查看os模块的源代码开始,其中第26行读取 导入系统,错误号 这告诉我们,os.sys只是对标准sys模块的引用。 然后我们转到sy
import os
s = os.sys.stdin.buffer.read(1024*32)
如果运行pythont1.py,那么进程将被阻塞并按预期等待输入。
为什么python3.3有1024*32-1缓冲区长度限制?是系统不同,还是所有系统都相同?我们如何才能消除这一限制
顺便说一句:我使用windows 7 python 32位版本3.3,我们从查看
os
模块的源代码开始,其中第26行读取导入系统,错误号
这告诉我们,
os.sys
只是对标准sys
模块的引用。然后我们转到
sys
模块的第二行,在第1593行中,我们找到了以下注释(感谢有人把它放在那里……)/*stdin/stdout/stderr现在由pythonrun.c*/
然后我们转到
pythonrun.c
,在第1086行我们遇到了以下代码:std=create_stdio(iomod,fd,0,”,编码,错误)代码>
这在第1091行:
PySys\u SetObject(“stdin”,std)代码>
然后我们查找在第910行中找到的createstdio()
函数的定义。我们在第999行查找此函数的返回值,如下所示:
返回流代码>
现在我们必须找出流是什么。它是在第984行中调用的函数\u PyObject\u CallMethodId()
的返回值
我希望你能看到流程-试着从这里开始。在64位Linux上看不到任何错误,直到我将其增加到1024**3*6
,然后我得到一个MemoryError
。我的Win7+Python3.3.0-32位也有同样的问题。但是如果我在Cygwin Python 2.7.3中运行该脚本,它将运行得非常完美。升级到3.3.1没有帮助。我尝试过32位Python 3.3.0、3.3.1、2.7.4和64位3.31,但都有相同的问题。这似乎是Windows端口特定的问题。您可以尝试在Python邮件列表中问这个问题。
D:\Projects\pytools>python t1.py
Traceback (most recent call last):
File "t1.py", line 2, in <module>
s = os.sys.stdin.buffer.read(1024*32)
OSError: [Errno 12] Not enough space
import os
s = os.sys.stdin.buffer.read(1024*32-1)