Pycurl和io.StringIO - pycurl.error:(23,'写体失败)

Nik*_*ach 12 python curl pycurl stringio python-3.x

我正在将ebay sdk移植到python3,我偶然发现了以下问题.

我正在使用pycurl发送一些HTTP请求.这是我配置它的方式:

    self._curl = pycurl.Curl()
    self._curl.setopt(pycurl.FOLLOWLOCATION, 1)
    self._curl.setopt(pycurl.URL, str(request_url))
    self._curl.setopt(pycurl.SSL_VERIFYPEER, 0)

    self._response_header = io.StringIO()
    self._response_body = io.StringIO()

    self._curl.setopt(pycurl.CONNECTTIMEOUT, self.timeout)
    self._curl.setopt(pycurl.TIMEOUT, self.timeout)

    self._curl.setopt(pycurl.HEADERFUNCTION, self._response_header.write)
    self._curl.setopt(pycurl.WRITEFUNCTION, self._response_body.write)
Run Code Online (Sandbox Code Playgroud)

当我调用self._curl.perform()时,我收到以下错误:

pycurl.error: (23, 'Failed writing body (1457 != 1460)')
Run Code Online (Sandbox Code Playgroud)

据我所知,这意味着写函数存在问题,但我无法弄清楚究竟是什么.可能与从StringIO模块迁移到io有关,但我不确定.

UPD:我尝试过以下方法:

    def body(buf):
        self._response_body.write(buf)

    def header(buf):
        self._response_header.write(buf)

    self._curl.setopt(pycurl.HEADERFUNCTION, header)
    self._curl.setopt(pycurl.WRITEFUNCTION, body)
Run Code Online (Sandbox Code Playgroud)

它的工作原理.我试图用lambdas做同样的技巧(而不是定义那些笨拙的功能,但它没有用.

小智 26

我相信问题是pycurl不再像StringIO那样运行.解决方案是使用io.BytesIO.然后,您可以将信息写入缓冲区并将其解码为字符串.

将BytesIO与pycurl而不是StringIO一起使用:

e = io.BytesIO()
c.setopt(pycurl.WRITEFUNCTION, e.write)
Run Code Online (Sandbox Code Playgroud)

解码BytesIO对象的字节信息:

htmlString = e.getvalue().decode('UTF-8')
Run Code Online (Sandbox Code Playgroud)

您可以使用任何类型的解码,但这应该为您提供一个可以解析的字符串对象.

希望这有助于人们使用Python 3.

  • 六年后出现,这仍然有帮助。谢谢! (3认同)