2013-02-18 36 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应用程序。

所以问题出现在服务器端(即我的错!)。如果您无法控制来自服务器的标题,我不知道您可以做什么。