2010-10-15 29 views
0

我一直在網上尋找解決方案來解決我的Python問題。我正嘗試使用urllib2連接從HTTP服務器讀取可能層出不窮的數據流。它是一些交互式通信的一部分,所以重要的是我可以獲取可用的數據,即使它不是一個完整的緩衝區。似乎沒有辦法讓read \ readline返回可用的數據。它會在返回之前永遠阻止整個(無盡的)流等待。便祕的Python urllib2插座

即使我使用fnctl將底層文件描述符設置爲非阻塞,urllib2文件對象仍然會阻止!一般來說,似乎沒有辦法讓python文件對象在read上返回所有可用數據(如果有的話),否則返回阻塞。

我見過一些關於尋求幫助的人的帖子,但我沒有看到任何解決方案。是什麼賦予了?我錯過了什麼嗎?這看起來像這樣一個正常的用例,完全毀了!我希望利用urllib2的能力來檢測配置的代理和使用分塊編碼,但我不能,如果它不會合作。

編輯:根據要求,這裏是一些示例代碼

客戶:

connection = urllib2.urlopen(commandpath) 
id = connection.readline() 

現在假設服務器使用塊傳輸編碼,並寫入一個塊往下流和塊包含行,然後等待。連接仍然打開,但客戶端在緩衝區中有數據等待。

我不能得到readreadline返回我知道它已經等待的數據,因爲它試圖讀直到連接結束。在這種情況下,連接可能永遠不會關閉,因此它將永遠等待或直到發生非活動超時,切斷連接。一旦連接斷開,它將返回,但這顯然不是我想要的行爲。

+0

我不確定我是否正確理解您要實現的目標。你什麼意思是阻止?你的意思是你希望你的腳本能夠在流不再提供更多數據或其他東西時繼續執行嗎? – jsalonen 2010-10-15 09:40:25

+0

請提供一些示例代碼;我們至少需要提出任何建議。 – tzot 2010-10-15 14:43:00

回答

1

urllib2在HTTP級別上運行,它與完整的文檔一起工作。我不認爲有沒有辦法繞過urllib2源代碼。

你可以做的是使用普通套接字(在這種情況下你必須自己談談HTTP),並且調用sock.recv(maxbytes),它只讀取可用數據。

更新:你可能想嘗試調用conn.fp._sock.recv(maxbytes),而不是conn.read(bytes)urllib2連接。

+0

使用urllib2連接的要點是,urllib2已經支持環境代理和分塊編碼,我並不太興奮實現自己。我覺得如果我能在最下方的褲子上踢點什麼,一切都會奏效...... – jdizzle 2010-10-15 18:26:22

+0

對,我不希望自己開始實施所有這些。 'conn.fp._sock.recv(maxbytes)'技巧對你有什麼好處嗎? – Wim 2010-10-18 15:37:10

+0

我實際上最終使用了conn.fp._sock.fp._sock或者其他類似的東西。我不得不實現一個分塊的解碼器,但這並不是那麼困難。這不必處理代理問題,真讓我害怕。 – jdizzle 2010-10-19 18:40:29