【问题标题】:Putting a pyCurl XML server response into a variable (Python)将 pyCurl XML 服务器响应放入变量中(Python)
【发布时间】:2008-11-02 05:38:48
【问题描述】:

我是 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 输入被打印到以太标准输出或标准错误(不确定是哪个)。我确信有一个简单的方法可以做到这一点,但我现在似乎无法想到它。如果您有任何提示可以为我指明正确的方向,我将不胜感激。提前致谢。

【问题讨论】:

    标签: python xml pycurl


    【解决方案1】:

    使用 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()
    

    【讨论】:

    【解决方案2】:

    The pycurl doc 明确表示:

    perform() -> 无

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

    看一个来自 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
    

    【讨论】:

    • 您可以将t.body_callback 替换为sys.stdout.write 以在不处理的情况下打印到标准输出。
    • 问题是到变量中 - 我刚刚从 pycurl 站点复制了一个示例。
    猜你喜欢
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2018-03-20
    • 2023-02-14
    • 2016-11-01
    • 2012-04-12
    相关资源
    最近更新 更多