Вывод поведения неблокирующего sys.stdin.read()Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Вывод поведения неблокирующего sys.stdin.read()

Сообщение Anonymous »

Не могли бы вы объяснить мне логику возвращаемого значения sys.stdin.read.read(10) в следующем коде, согласно документации?
Честно говоря, я не смог вывести это.

Код: Выделить всё

import sys, os

os.set_blocking(sys.stdin.fileno(), False)
c = sys.stdin.read(10)
print(c)
Это мои рассуждения о том, чего мне следует ожидать, которые, вероятно, ошибочны, поскольку заканчиваются тупиком:
  • Код: Выделить всё

    sys.stdin
    входит в число (цитата) «обычных текстовых файлов, подобных тем, которые возвращаются open()», поэтому по выводу это объект TextIOWrapper.
  • Объект TextIOWrapper — это
A буферизованный текстовый поток, обеспечивающий доступ более высокого уровня к буферизованному двоичному потоку BufferedIOBase. Он наследует от TextIOBase.
  • Вся документация io.TextIO не делает различий между блокировками. /неблокирующий. В частности, io.TextIOBase.read(size=-1, /)
Чтение и возврат максимум размер символов из потока как одиночный str. Если размер отрицательный или нет, читается до конца файла.
  • Код: Выделить всё

    BufferedIOBaseВ документации 
    указано, что такие методы, как read() (жирный шрифт — мой):
[ ...] может вызвать BlockingIOError, если базовый необработанный поток находится в неблокирующем режиме и не может принять или передать достаточно данных;
Что еще больше усложняет ситуацию, я заметил, что sys.stdout.buffer существует (по крайней мере, в моей реализации CPython), и это BufferedReader, который наследуется от BufferedIOBase, и
  • в документации указано, что io.BufferedReader.read(size=-1, /):
< цитата>
Чтение и возврат size байтов или, если size не задано или отрицательное значение, до тех пор, пока не будет достигнут конец EOF или если вызов чтения не заблокируется в неблокирующем режиме.< /p>

(кстати, мой английский недостаточно хорош, чтобы понять, что будет возвращено в случае вызова, который блокируется в неблокирующем режиме).< /p>
Наконец:
  • PEP3116 заявляет, что (жирный шрифт — мой; сегодня IOError заменен на OSError)
При буферизованном вводе-выводе и тексте Уровни ввода-вывода: если чтение или запись завершаются неудачно из-за условия неблокировки, они вызывают ошибку IOError с errno, установленным в EAGAIN.

что, кажется, контрастирует с 4) («поднять» против «можно поднять») и 5) («поднять» против вообще не повышать).

Подробнее здесь: https://stackoverflow.com/questions/793 ... stdin-read
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»