Функция io.open()
не принимает файл-объект в качестве первого параметра.
Однако он принимает целое число, представляющее дескриптор открытого файла.так что вы можете добиться успеха, используя:
f = io.open(env['wsgi.input'].fileno, 'rb')
Приложение:
Модуль io написан для Python 3, где обработка строк сильно отличается от Python 2.вызов read()
для файла, открытого в двоичном режиме, возвращает объект bytes
в Python 3, но str
в Python 2, но при переносе файла с использованием модуля io
и использования двоичного режима модуль io ожидаетread()
чтобы вернуть bytes
.
Вы можете попытаться исправить исходный файловый объект, вернув ему bytes
:
def fix(file):
# wrap 'func' to convert its return value to bytes using the specified encoding
def wrap(func, encoding):
def read(*args, **kwargs):
return bytes(func(*args, **kwargs), encoding)
return read
file.read = wrap(file.read, 'ascii')
fix(env['wsgi.input'])
f = io.open(env['wsgi.input'].fileno, 'rb')
Вышеприведенная функция переносит метод read()
, но может быть завершена для переноса readline()
,также требуется небольшая дополнительная работа, чтобы обернуть readlines()
...