具有字节流的pycurl READFUNCTION

时间:2010-03-06 22:04:39

标签: python pycurl

有没有办法为pycurl的READFUNCTION写一个不返回字符串的回调函数?我打算通过pycurl发送二进制数据块。我尝试编写一个回调函数来执行此操作:

def read_callback(self, size):
  for block in data:
    yield block

但pycurl退出时出现错误,指出返回类型必须是字符串。

1 个答案:

答案 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