Python 无法将*IO()对象分配给WRITEDATA、pycurl

Python 无法将*IO()对象分配给WRITEDATA、pycurl,python,pycurl,Python,Pycurl,其他人是否注意到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

其他人是否注意到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
回溯(最近一次呼叫最后一次):
文件“/get_python2.py”,第9行,在
c、 setopt(c.WRITEDATA,缓冲区)
TypeError:setopt的参数无效
分配WRITEFUNCTION&其他功能似乎与广告中的功能相同。有人知道这里发生了什么吗?

我认为这种情况表明,当您没有真正的文件对象时,您必须使用
WRITEFUNCTION

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

因此,您需要使用:

c.setopt(c.WRITEFUNCTION, buffer.write)
编辑:

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

从PycURL 7.19.3开始,WRITEDATA接受任何具有写入方法的Python对象

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

我有完全相同的问题,它是这样工作的。
pycurl(7.19.0)

我想就是这个了。但这个例子取自PyCURL快速入门。无论如何,谢谢你指出这一点,请投赞成票@user1906583:很有趣……您使用的是PycURL和Python的哪些版本?有人想调试吗?我在Cygwin上使用Python2.7.8,它是从Cygwin的包管理thingy安装的。然后我使用“python setup.py install”下载了pycurl 7.19.5。上面的示例来自第一个代码块。顺便说一句,如果我实例化buffer=BytesIO(),那么c.setopt(c.WRITEFUNCTION,buffer.write)是有效的。@user1906583:我问的原因是你的示例对我有效(没有例外)。也许您在实际运行的python实例中安装了pycurl。如果您在程序中打印出
pycurl.version
,它是否显示该版本(7.19.5)?你好,Gerrat。这里有一个字符串返回“'libcurl/7.39.0openssl/1.0.1jzlib/1.2.8libidn/1.29libssh2/1.4.2'”。看来我使用的是比pycurl的7.19.3版本更老的版本。这意味着我的“python setup.py安装”无法正常工作。可惜我没有记录这次安装。但很高兴知道,我现在有一个更深层次的问题!