2013-02-18 36 views
7

Tôi đang sử dụng urllib.request.urlopen() để GET từ một dịch vụ web mà tôi đang thử nghiệm.socket ResourceWarning sử dụng urllib trong Python 3

Điều này trả về một đối tượng HTTPResponse, sau đó tôi đọc() để lấy nội dung phản hồi.

Nhưng tôi luôn thấy một ResourceWarning về một ổ cắm không khép kín từ socket.py

Dưới đây là các chức năng có liên quan:

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) 

Đây là cảnh báo vì nó xuất hiện trong đầu ra của chương trình:

$ ./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) 

Nếu có bất kỳ điều gì tôi có thể thực hiện với HTTPResponse (hoặc Yêu cầu?) Để làm cho nó gần đúng ổ cắm của nó, Tôi thực sự muốn để biết, vì mã này là dành cho các bài kiểm tra đơn vị của tôi; Tôi không thích bỏ qua cảnh báo ở mọi nơi, nhưng đặc biệt là không có ở đó.

+1

Tôi không thể tái tạo nó trên Python 3.3.1. Bạn có thể kiểm tra nó trên phiên bản Python mới nhất không; có một vài lỗi liên quan đến [đóng socket] (http://bugs.python.org/issue12133) (ResourceWarning trên thời gian chờ) và ['" Connection: close "' header response] (http: // bugs. python.org/issue12576) (cho thấy có các đường dẫn mã khác nhau tùy thuộc vào tiêu đề). – jfs

Trả lời

3

Tôi không biết nếu đây là câu trả lời là nhưng đó là một phần của cách trả lời.

Nếu tôi thêm tiêu đề "kết nối: đóng" vào phản hồi từ dịch vụ web của tôi, đối tượng HTTPResponse dường như tự làm sạch chính xác mà không có cảnh báo.

Và trên thực tế, HTTP Spec (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html) nói:

HTTP/1.1 ứng dụng không hỗ trợ kết nối liên tục phải bao gồm "gần" tùy chọn kết nối trong mỗi tin nhắn.

Vì vậy, sự cố ở đầu máy chủ (tức là lỗi của tôi!). Trong trường hợp bạn không có quyền kiểm soát các tiêu đề đến từ máy chủ, tôi không biết bạn có thể làm gì.

Các vấn đề liên quan