有没有办法为 pycurl 的 READFUNCTION 编写一个不返回字符串的回调函数?我计划通过 pycurl 发送二进制数据块。我尝试编写一个回调函数来执行此操作:
def read_callback(self, size): 对于数据块: 产量块
但是 pycurl 退出并显示返回类型必须是字符串的错误。
“读取函数”必须返回一串字节——记住,libcurl 是底层 C 库的包装器,所以它当然是类型挑剔的!-)。但是,它可以完美地是一个二进制字节字符串(2.*
至少在 Python 中——我不认为 pycurl 无论如何都适用于 Python 3),所以它当然可以返回“二进制数据块”——只要它们'重新编码为字节字符串并遵守size
约束。
您刚刚编码的内容在调用时会返回一个“生成器函数”——显然不好。假设data
是一个非空字节字符串的列表,您需要适当地对其进行切分和切片,每次返回一个字节字符串return
,当然不是 yield
(!)。
不知道data
你的神秘来自哪里——让我们假设你的意思是self.data
。然后,您需要在其他实例变量中跟踪当前索引的当前索引self.data
,并且可能 - 如果项目长于size
- 当前片段的“尚未发送的部分”。
例如,它可能是:
class MySender(object):
def __init__(self, data):
self.data = data
self.i = 0
self.rest = 0
def readfunction(self, size):
if self.i >= len(self.data):
return ''
result = self.data[self.i][self.rest:self.rest+size]
self.rest += size
if self.rest >= len(self.data[self.i]):
self.i += 1
self.rest = 0
如果 self.data 的项目是其他类型的二进制数据(尚未编码为字节字符串),您可以将它们转换为字节字符串,例如借助 Python 库模块(如struct
和array
.