2015-04-22 63 views
0

我比較這兩段代碼:Python的請求庫 - 奇怪的行爲VS捲髮

subprocess.call('curl -XGET http://localhost:81/proxy/bparc/my_key > /dev/null' ,shell=True) 

VS

response = requests.get('http://localhost:81/proxy/bparc/my_key') 
print len(response.text) 

,第一個將始終在0.01秒運行英寸但是第二次有時會花費30秒,而其他時間則會少於0.01秒。

任何想法可能會發生什麼?請求是否做了一些讓事情放緩的事情?運行len不好嗎?

+0

運行'len'並不「壞」。它可能是相關的 - 也許'curl'一旦看到你不想輸出就停止讀數據,而'request'不能這樣做,因爲len(response.text)需要輸出。但我不認爲'curl'實際上是這樣做的,所以... – abarnert

+0

是的,requests.get步驟是即時的,所以我想它不會下載數據,直到您嘗試訪問它?我想知道是要求response.text導致它對數據進行一些處理。我不確定爲什麼只有特定的網址。 – Greg

+0

正確; 'requests.get'基本上只讀取一個數據包(除非它只需要響應頭部分);訪問'文本'下載一切。但除了下載之外,它所做的唯一處理就是將字節解碼爲unicode,這應該只需要很短的時間。 – abarnert

回答

0

好的,改爲response.content修復它。 response.text做了很多額外的東西,你不需要二進制數據。

response = requests.get('http://localhost:81/proxy/bparc/my_key') 
print len(response.content) 
+0

反應不是實際的文字嗎?在這種情況下,特別是如果你使用Python 2.6或3.0,但也可能使用2.7和3.1+,我可以想象解碼需要很長時間。舊版本的代碼必須爲每一個無法解碼的字符調用一個函數,並且無法將其短路。 – abarnert

+0

無論如何,'r.text'基本上就是'r.content.decode(r.encoding)',它不是「很多額外的東西」,它只是一個額外的東西。 「內容」中已經發生了其他一切(gzip解碼等)。 – abarnert

+0

這不是文字,它是二進制數據。這看起來就是這個問題。 – Greg