2013-04-23 107 views
1
import os 
s = os.sys.stdin.buffer.read(1024*32) 

失敗,蟒蛇os.sys.stdin.buffer.read失敗如果給緩衝區長度

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蟒蛇32位版本3.3

+0

直到我將它增加到1024 * 3 * 6時,纔在Linux 64bit上看到任何錯誤,然後出現'MemoryError'。 – 2013-04-24 16:56:19

+0

我的Win7 + Python3.3.0-32bit也出現同樣的問題。但是如果我在Cygwin Python 2.7.3中運行腳本,它運行得很完美。升級到3.3.1沒有幫助。 – Alexey 2013-04-24 17:01:19

+0

我試過32位Python 3.3.0,3.3.1,2.7.4和64位3.31,但都有同樣的問題。這似乎是Windows端口特定的問題。你可以嘗試在Python郵件列表上提出這個問題。 – Alexey 2013-04-24 17:21:32

回答

0

我們首先看os模塊here,其中26行讀取
import sys, errno
這告訴我們的來源,os.sys僅僅是一個參考標準sys模塊。
然後我們頭向sys模塊,其中線1593,我們發現下面評論的source(謝天謝地有人把它放在那裏...):
/* stdin/stdout/stderr are now set by pythonrun.c */
然後我們去pythonrun.cfile,我們見面在1086線以下代碼:
std = create_stdio(iomod, fd, 0, "<stdin>", encoding, errors);
,這對行1091:
PySys_SetObject("stdin", std);
然後我們找create_stdio()功能的定義,我們在線路910我們期待這個函數的返回值發現這是對999行,看起來像這樣:
return stream;
現在我們必須找出stream是什麼。它是函數_PyObject_CallMethodId()在984行中調用的返回值。

我希望你看到流 - 試着從這裏開始。