有没有办法为pycurl的READFUNCTION写一个不返回字符串的回调函数?我打算通过pycurl发送二进制数据块。我尝试编写一个回调函数来执行此操作:
def read_callback(self, size): for block in data: yield block
但pycurl退出时出现错误,指出返回类型必须是字符串。
答案 0 :(得分:1)
“读取函数”必须返回一个字节字符串 - 记住,libcurl是底层C库的包装器,所以当然它是类型挑剔的! - )。但是,它完全可以是二进制字节字符串(至少在Python 2.*
中 - 我认为pycurl无论如何都不适用于Python 3),所以它当然可以返回“二进制数据块” - 只要它们被编码为字节串并尊重size
约束。
你刚刚编码的内容,当被调用时,返回一个“生成器函数” - 显然没有好处。假设data
是非空字节字符串的列表,您需要对其进行适当的切块和切片,每次返回一个字节串,return
,绝对不 { {1}}(!)。
不确定你的神秘yield
来自哪里 - 让我们假设你的意思是data
。然后你需要跟踪当前索引的其他实例变量self.data
,并且可能 - 如果项目长于self.data
- 当前部分的“尚未发现的部分”也是。
例如,它可能是:
size
如果self.data的项是其他类型的二进制数据(尚未编码为字节字符串),则可以将它们转换为字节字符串,例如在Python库模块的帮助下,例如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
和struct
。