gpt4 book ai didi

Python I/O : How to use the wsgi. 来自 io 模块的输入流

转载 作者:行者123 更新时间:2023-12-01 06:05:15 26 4
gpt4 key购买 nike

在 WSGI 应用程序中,我们可以从 wsgi.input 字段读取行输入数据:

def application(env, start_response):
.....
data = env['wsgi.input'].read(num_bytes)
.....

但是,我想使用新的 io 模块包装类文件对象:

import io
def application(env, start_response):
.....
f = io.open(env['wsgi.input'], 'rb')
buffer = bytearray(buff_size)
read = f.readinto(buffer)
.....

问题是 io.open 不接受此类文件对象。关于如何做到这一点有什么想法吗?我需要从 env['wsgi.input'] 读取到缓冲区。

最佳答案

io.open() 函数不接受文件对象作为第一个参数。

但是,它接受一个表示打开文件句柄的整数。所以你可能会使用以下方法取得一些成功:

f = io.open(env['wsgi.input'].fileno, 'rb')

附录:

io 模块是为 python 3 编写的,其中字符串处理与 python 2 有很大不同。在以二进制模式打开的文件上调用 read() 会返回一个 bytes在 python 3 中是一个对象,但在 python 2 中是一个 str,但是当使用 io 模块包装文件并使用二进制模式时,io 模块期望 read() 返回字节

您可以尝试通过使其返回字节来修复原始文件对象:

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()...

关于Python I/O : How to use the wsgi. 来自 io 模块的输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8338430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com