【问题标题】:Fail to assign *IO() object to WRITEDATA, pycurl无法将 *IO() 对象分配给 WRITEDATA,pycurl
【发布时间】:2015-03-04 17:17:46
【问题描述】:

其他人注意到 pycurl 示例在 Python 2.* 上不起作用吗?

import pycurl
from StringIO import StringIO

buffer = StringIO()
c = pycurl.Curl()
c.setopt(c.URL, 'http://pycurl.sourceforge.net/')
c.setopt(c.WRITEDATA, buffer)
c.perform()
c.close()

body = buffer.getvalue()
# Body is a string in some encoding.
# In Python 2, we can print it without knowing what the encoding is.
print(body)

然后我遇到这样的失败

Traceback (most recent call last):
  File "./get_python2.py", line 9, in <module>
    c.setopt(c.WRITEDATA, buffer)
TypeError: invalid arguments to setopt

分配 WRITEFUNCTION 和其他功能似乎与宣传的一样。有人知道这里发生了什么吗?

【问题讨论】:

    标签: python pycurl


    【解决方案1】:

    我认为docs 表示当你没有真正的文件对象时你必须使用WRITEFUNCTION:

    在 Python 3 和 Python 2 上,当值不是真正的文件对象时,在 PycURL 中通过 WRITEFUNCTION 模拟 WRITEDATA。

    所以你需要使用:

    c.setopt(c.WRITEFUNCTION, buffer.write)
    

    编辑:

    PycURL Quickstart 使用 WRITEDATA 作为 StringIO 的示例,但它需要 PycURL >= 7.19.3 版:

    从 PycURL 7.19.3 开始,WRITEDATA 接受任何带有 write 方法的 Python 对象

    【讨论】:

    • 我想就是这样。但是这个例子取自 PyCURL Quick Start...。无论如何,感谢您指出这一点,请点赞!
    • @user1906583:有趣……你使用的是哪个版本的 PycURL 和 Python?
    • 有人要调试吗?我在 Cygwin 上使用 Python 2.7.8,从 Cygwin 的包 mangement-thingy 安装。然后我刚刚使用“python setup.py install”下载了pycurl 7.19.5。上面的例子来自pycurl.sourceforge.net/doc/quickstart.html,第一个代码块。顺便说一句,你是对的,如果我实例化 buffer = BytesIO(),c.setopt(c.WRITEFUNCTION, buffer.write) 就可以工作。
    • @user1906583:我问的原因是你的例子对我有用(没有例外)。也许您已将 pycurl 安装在与实际运行的不同的 python 实例中。如果您在程序中打印出pycurl.version,它会显示该版本(7.19.5)吗?
    • 你好,杰拉特。这是一个返回“'libcurl/7.39.0 OpenSSL/1.0.1j zlib/1.2.8 libidn/1.29 libssh2/1.4.2'”的字符串。所以看起来我使用的是 7.19.3 之前的 pycurl。这意味着我的“python setup.py install”无法正常工作。太糟糕了,我没有记录这个安装的日志。但很高兴知道我现在有一个更深层次的问题!
    【解决方案2】:

    试试 c.setopt(c.WRITEFUNCTION, buffer.write)

    我遇到了完全相同的问题,并且以这种方式工作。 pycurl (7.19.0)

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多