pycurl的READFUNCTION与字节流

0 投票
1 回答
1450 浏览
提问于 2025-04-15 20:06

有没有办法为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的一些库模块,比如structarray,将它们转换成字节字符串。

撰写回答