0

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

def read_callback(self, size):
  对于数据块:
    产量块

但是 pycurl 退出并显示返回类型必须是字符串的错误。

4

1 回答 1

1

“读取函数”必须返回一串字节——记住,libcurl 是底层 C 库的包装器,所以它当然是类型挑剔的!-)。但是,它可以完美地是一个二进制字节字符串(2.*至少在 Python 中——我不认为 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.

于 2010-03-06T23:06:13.693 回答