将 pyCurl XML 服务器响应放入变量中 (Python)

发布于 2024-07-08 18:28:19 字数 688 浏览 14 评论 0原文

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

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

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

I'm a Python novice, trying to use pyCurl. The project I am working on is creating a Python wrapper for the twitpic.com API (http://twitpic.com/api.do). For reference purposes, check out the code (http://pastebin.com/f4c498b6e) and the error I'm getting (http://pastebin.com/mff11d31).

Pay special attention to line 27 of the code, which contains "xml = server.perform()". After researching my problem, I discovered that unlike I had previously thought, .perform() does not return the xml response from twitpic.com, but None, when the upload succeeds (duh!).

After looking at the error output further, it seems to me like the xml input that I want stuffed into the "xml" variable is instead being printed to ether standard output or standard error (not sure which). I'm sure there is an easy way to do this, but I cannot seem to think of it at the moment. If you have any tips that could point me in the right direction, I'd be very appreciative. Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心如狂蝶 2024-07-15 18:28:19

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

Using a StringIO would be much cleaner, no point in using a dummy class like that if all you want is the response data...

Something like this would suffice:

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()
单调的奢华 2024-07-15 18:28:19

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

The pycurl doc explicitly says:

perform() -> None

So the expected result is what you observe.

looking at an example from the pycurl site:

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

The interface requires a class instance - Test() - with a specific callback to save the content. Note the call c.setopt(c.WRITEFUNCTION, t.body_callback) - something like this is missing in your code, so you do not receive any data (buf in the example). The example shows how to access the content:

print t.contents
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文