3

我是 Python 新手,正在尝试使用 pyCurl。我正在进行的项目是为 twitpic.com API ( http://twitpic.com/api.do ) 创建一个 Python 包装器。出于参考目的,请查看代码 ( http://pastebin.com/f4c498b6e ) 和我收到的错误 ( http://pastebin.com/mff11d31 )。

请特别注意代码的第 27 行,其中包含“xml = server.perform()”。在研究了我的问题后,我发现与我之前的想法不同,当上传成功时,.perform() 不会返回来自 twitpic.com 的 xml 响应,而是 None (呃!)。

在进一步查看错误输出之后,在我看来,我想填充到“xml”变量中的 xml 输入被打印到以太标准输出或标准错误(不确定是哪个)。我确信有一种简单的方法可以做到这一点,但我目前似乎无法想到它。如果您有任何提示可以为我指明正确的方向,我将不胜感激。提前致谢。

4

2 回答 2

12

使用 StringIO 会更干净,如果你想要的只是响应数据,那么使用这样的虚拟类毫无意义......

这样的事情就足够了:

import pycurl
import cStringIO

response = cStringIO.StringIO()

c = pycurl.Curl()
c.setopt(c.URL, 'http://www.turnkeylinux.org')
c.setopt(c.WRITEFUNCTION, response.write)
c.perform()
c.close()

print response.getvalue()
于 2010-02-28T14:42:24.433 回答
4

pycurl 文档明确表示:

执行()-> 无

所以预期的结果就是你观察到的。

查看 pycurl 站点的示例:

import sys
import pycurl

class Test:
   def __init__(self):
       self.contents = ''

   def body_callback(self, buf):
       self.contents = self.contents + buf

print >>sys.stderr, 'Testing', pycurl.version

t = Test()
c = pycurl.Curl()
c.setopt(c.URL, 'http://curl.haxx.se/dev/')
c.setopt(c.WRITEFUNCTION, t.body_callback)
c.perform()
c.close()

print t.contents

该接口需要一个类实例——Test()带有一个特定的回调来保存内容。请注意调用c.setopt(c.WRITEFUNCTION, t.body_callback)- 您的代码中缺少类似的内容,因此您不会收到任何数据(buf在示例中)。该示例显示了如何访问内容:

print t.contents
于 2008-11-02T06:35:34.433 回答