Python 带有bytestream的pycurl READFUNCTION

Python 带有bytestream的pycurl READFUNCTION,python,pycurl,Python,Pycurl,有没有办法为pycurl的READFUNCTION编写一个不返回字符串的回调函数?我计划通过pycurl发送二进制数据块。我尝试编写一个回调函数来实现以下功能: def read_callback(self, size): for block in data: yield block def read_回调(自身,大小): 对于块输入数据: 屈服块 但是pycurl退出时会出现一个错误,即返回类型必须是字符串。读取函数必须返回一个字节字符串——请记住,libcurl是底层C库上的包装

有没有办法为pycurl的READFUNCTION编写一个不返回字符串的回调函数?我计划通过pycurl发送二进制数据块。我尝试编写一个回调函数来实现以下功能:

def read_callback(self, size): for block in data: yield block def read_回调(自身,大小): 对于块输入数据: 屈服块 但是pycurl退出时会出现一个错误,即返回类型必须是字符串。

读取函数必须返回一个字节字符串——请记住,libcurl是底层C库上的包装器,因此它的类型当然很挑剔!)。然而,它完全可以是一个二进制字节字符串(至少在Python中是这样的,我认为pycurl无论如何都不能与Python 3一起工作),因此它当然可以返回“二进制数据块”——只要它们被编码成字节字符串并遵守
大小
约束

你刚刚编码的东西,当被调用时,返回一个“生成器函数”——显然不好。假设
数据
是一个非空字节字符串列表,您需要对其进行适当的切分,每次返回一个字节字符串,使用
返回
,肯定
产生
(!)

我不确定你那神秘的
数据
是从哪里来的——让我们假设你指的是
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实例的read函数传递给pycurl实例。我只是想尝试编写读取回调,以便实现“分块”传输,但我认为pycurl最好自己处理。@maranas,当然,cStringIO更简单,如果您可以在那里复制数据,我的代码仅在您负担不起的情况下才适用;-)。