有没有办法为pycurl的READFUNCTION写回调函数,它不返回字符串?我正计划通过pycurl发送二进制数据块。我试着写一个回调函数,这是否:pycurl READFUNCTION与字节流
def read_callback(self, size): for block in data: yield block
但pycurl退出时,说的返回类型必须是一个字符串错误。
有没有办法为pycurl的READFUNCTION写回调函数,它不返回字符串?我正计划通过pycurl发送二进制数据块。我试着写一个回调函数,这是否:pycurl READFUNCTION与字节流
def read_callback(self, size): for block in data: yield block
但pycurl退出时,说的返回类型必须是一个字符串错误。
“读取函数”必须返回一串字节 - 记住,libcurl是一个底层C库的包装,所以当然它是类型挑剔的!)。然而,它完全可以是一个二进制字节串(至少在Python 2.*
中 - 我不认为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
。
我明白了。我没有写回调函数,而是使用了cStringIO。我只是将数据块写入cStringIO实例,并将cStringIO实例的读取函数传递给pycurl实例。 我只是想我会尝试写回读回调,所以我可以实现“分块”传输,但认为pycurl最好是自己动手。 – maranas 2010-03-07 07:30:24
@maranas,当然,如果你有能力复制那里的数据,cStringIO会更简单,我的代码只适用于你无法承受的情况;-)。 – 2010-03-07 16:45:38