如果给定缓冲区长度,则python os.sys.stdin.buffer.read失败

时间:2013-04-23 11:31:37

标签: python windows python-3.3

import os
s = os.sys.stdin.buffer.read(1024*32)

失败
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

buf如果给出buflen = 1024 * 32-1那么它就是正确的

import os
s = os.sys.stdin.buffer.read(1024*32-1)

如果你运行python t1.py,那么进程被阻塞并等待输入。 为什么python3.3有1024 * 32-1的缓冲区长度限制?它是系统不同,还是所有系统都一样?我们如何才能消除这种限制?

BTW:我使用的是Windows 7 python 32位版本3.3

1 个答案:

答案 0 :(得分:0)

我们首先查看os模块here的来源,其中第26行读取
import sys, errno
这告诉我们os.sys只是对标准sys模块的引用 然后我们前往sys模块的source,在第1593行我们发现以下评论(谢天谢地有人把它放在那里......):
/* stdin/stdout/stderr are now set by pythonrun.c */
然后我们转到pythonrun.c file,我们在第1086行遇到以下代码:
std = create_stdio(iomod, fd, 0, "<stdin>", encoding, errors);
这在第1091行:
PySys_SetObject("stdin", std);
然后我们查找在行910中找到的create_stdio()函数的定义。我们在999行查找此函数的返回值,如下所示:
return stream;
现在我们必须找出stream是什么。它是第984行中调用的函数_PyObject_CallMethodId()的返回值。

我希望你看到流程 - 试着从这里开始。