2008-11-02 50 views
3

我是一個Python新手,嘗試使用pyCurl。我正在開發的項目是爲twitpic.com API(http://twitpic.com/api.do)創建一個Python包裝器。爲了便於參考,請查看代碼(http://pastebin.com/f4c498b6e)和我收到的錯誤(http://pastebin.com/mff11d31)。將pyCurl XML服務器響應放入一個變量(Python)

請特別注意代碼的第27行,其中包含「xml = server.perform()」。在研究了我的問題之後,我發現,與我之前的想法不同,.perform()不會從twitpic.com返回xml響應,但會返回None,當上傳成功時(duh!)。

在進一步查看錯誤輸出後,在我看來,我想將填入「xml」變量的xml輸入打印到ether標準輸出或標準錯誤(不知道哪個)。我確信有一個簡單的方法可以做到這一點,但目前我似乎無法想到它。如果您有任何提示可能會指向正確的方向,我會非常感激。提前致謝。

回答

4

The pycurl doc明確地說:

執行() - >無

因此,預期的結果是你觀察什麼。

看着從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 
+0

您可以用`sys.stdout.write`替換`t.body_callback`來打印到stdout而不進行處理。 – jfs 2008-11-02 18:15:55

+0

問題是*變成了一個變量* - 我剛從pycurl網站複製了一個例子。 – gimel 2008-11-03 05:59:58

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