【问题标题】:Pycurl and io.StringIO - pycurl.error: (23, 'Failed writing body)Pycurl 和 io.StringIO - pycurl.error: (23, 'Failed writing body)
【发布时间】:2013-11-05 13:14:48
【问题描述】:

我正在将 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)

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

pycurl.error: (23, 'Failed writing body (1457 != 1460)')

据我所知,这意味着 write 函数存在问题,但我无法弄清楚它到底是什么。可能与从 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)

它有效。我尝试用 lambdas 做同样的技巧(而不是定义那些尴尬的函数,但它没有用。

【问题讨论】:

    标签: python curl python-3.x pycurl stringio


    【解决方案1】:

    我认为问题在于 pycurl 不再像期望的那样与 StringIO 一起工作。一个解决方案是改用 io.BytesIO。然后,您可以将信息写入缓冲区并将其解码为字符串。

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

    e = io.BytesIO()
    c.setopt(pycurl.WRITEFUNCTION, e.write)
    

    从 BytesIO 对象中解码字节信息:

    htmlString = e.getvalue().decode('UTF-8')
    

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

    希望这对使用 Python 3 的人有所帮助。

    【讨论】:

    • 6 年后出现,这仍然有帮助。谢谢!
    • 7 年了,仍然在帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多