2013-04-23 1 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? Является ли система другой, или же она одинаковой для всех систем? Как мы можем устранить это ограничение?

КСТАТИ: я с помощью окна 7 питона 32-битной версии 3,3

+0

Не вижу ошибок на Linux 64bit до тех пор, пока я не увеличу его до 1024 * 3 * 6', после чего я получу 'MemoryError'. –

+0

Та же проблема на моем Win7 + Python3.3.0-32bit. Но если я запустил скрипт в Cygwin Python 2.7.3, он работает отлично. Обновление до 3.3.1 не помогает. – Alexey

+0

Я пробовал 32-разрядные Python 3.3.0, 3.3.1, 2.7.4 и 64-разрядные 3.31, но все они имеют ту же проблему. Это, по-видимому, проблема с Windows-портами. Вы можете попробовать задать этот вопрос в списке рассылки Python. – Alexey

ответ

0

Мы начинаем смотреть на источнике os модуля here, где строка 26 читает
import sys, errno
Это говорит нам, что os.sys является просто ссылкой стандартный модуль sys.
Тогда над головой source модуля sys, где в строке 1593 мы находим следующий комментарий (к счастью, кто-то положил его там ...):
/* 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.

Надеюсь, вы видите поток - попробуйте следовать отсюда.

Смежные вопросы