2013-02-18 30 views
7

我正在使用urllib.request.urlopen()從我試圖測試的Web服務中獲取GET。套接字ResourceWarning在Python 3中使用urllib

這將返回一個HTTPResponse對象,然後我讀取()以獲取響應正文。

但我總是看到來自socket.py

這裏未閉合的插座ResourceWarning的相關功能:

from urllib.request import Request, urlopen 

def get_from_webservice(url): 
    """ GET from the webservice """ 
    req = Request(url, method="GET", headers=HEADERS) 
    with urlopen(req) as rsp: 
     body = rsp.read().decode('utf-8') 
     return json.loads(body) 

這裏的警告,因爲它出現在程序的輸出:

$ ./test/test_webservices.py 
/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/socket.py:359: ResourceWarning: unclosed <socket.socket object, fd=5, family=30, type=1, proto=6> 
self._sock = None 
.s 
---------------------------------------------------------------------- 
Ran 2 tests in 0.010s 

OK (skipped=1) 

如果有什麼我可以做的HTTPResponse(或請求?),使其關閉它的插座乾淨, 我真的很喜歡要知道,因爲這段代碼是用於我的單元測試;我不喜歡 忽略任何地方的警告,但尤其是不存在。

+1

我無法在Python 3.3.1上重現它。你可以在最新的Python版本上測試它嗎? [關閉套接字](http://bugs.python.org/issue12133)(ResourceWarning on timeout)和['「Connection:close」[response header]](http:// bugs。 python.org/issue12576)(顯示根據標題有不同的代碼路徑)。 – jfs 2013-05-23 20:46:03

回答

3

我不知道這是否答案,但它是答案的一部分。

如果我將頭部「connection:close」添加到來自我的Web服務的響應中,則HTTPResponse對象似乎可以正常清理而不會發出警告。

而事實上,HTTP規範(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html)說:

HTTP /不支持持久連接必須在每個消息中的「關閉」連接選項1.1應用程序。

所以問題出現在服務器端(即我的錯!)。如果您無法控制來自服務器的標題,我不知道您可以做什麼。