首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pycurl和io.StringIO - pycurl.error:(23,失败的写作体)

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

Stack Overflow用户
提问于 2013-10-26 12:00:25
回答 1查看 12.8K关注 0票数 16

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

我正在使用pycurl发送一些HTTP请求。下面是我如何配置它:

代码语言:javascript
复制
    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()时,我得到以下错误:

代码语言:javascript
复制
pycurl.error: (23, 'Failed writing body (1457 != 1460)')

据我所知,这意味着写函数有问题,但我不知道它到底是什么。可能与从StringIO模块迁移到io有关,但我不确定。

UPD:我尝试了以下几种方法:

代码语言:javascript
复制
    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做同样的技巧(而不是定义那些尴尬的函数,但它没有起作用。

EN

回答 1

Stack Overflow用户

发布于 2014-05-12 13:23:30

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

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

代码语言:javascript
复制
e = io.BytesIO()
c.setopt(pycurl.WRITEFUNCTION, e.write)

从BytesIO对象解码字节信息:

代码语言:javascript
复制
htmlString = e.getvalue().decode('UTF-8')

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

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

票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19606447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档