pycurl的READFUNCTION与字节流
有没有办法为pycurl的READFUNCTION写一个回调函数,而这个函数不返回字符串?我打算通过pycurl发送一些二进制数据。我尝试写了一个这样的回调函数:
def read_callback(self, size): for block in data: yield block
但是pycurl报错,提示返回类型必须是字符串。
1 个回答
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的一些库模块,比如struct
和array
,将它们转换成字节字符串。