2010-03-06 52 views
0

有没有办法为pycurl的READFUNCTION写回调函数,它不返回字符串?我正计划通过pycurl发送二进制数据块。我试着写一个回调函数,这是否:pycurl READFUNCTION与字节流

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

但pycurl退出时,说的返回类型必须是一个字符串错误。

回答

1

“读取函数”必须返回一串字节 - 记住,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库模块的帮助下,如structarray

+0

我明白了。我没有写回调函数,而是使用了cStringIO。我只是将数据块写入cStringIO实例,并将cStringIO实例的读取函数传递给pycurl实例。 我只是想我会尝试写回读回调,所以我可以实现“分块”传输,但认为pycurl最好是自己动手。 – maranas 2010-03-07 07:30:24

+0

@maranas,当然,如果你有能力复制那里的数据,cStringIO会更简单,我的代码只适用于你无法承受的情况;-)。 – 2010-03-07 16:45:38