2013-02-18 17 views
7

में urllib का उपयोग करके चेतावनी मैं एक वेब सेवा से प्राप्त करने के लिए urllib.request.urlopen() का उपयोग कर रहा हूं जिसे मैं परीक्षण करने का प्रयास कर रहा हूं।सॉकेट संसाधन पाइथन 3

यह एक HTTPResponse ऑब्जेक्ट देता है, जिसे मैं प्रतिक्रिया शरीर प्राप्त करने के लिए() पढ़ता हूं।

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

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) 

यहाँ चेतावनी के रूप में यह कार्यक्रम के उत्पादन में दिखाई देता है:

लेकिन मैं हमेशा socket.py

यहाँ से एक खुली हुई सॉकेट के बारे में ResourceWarning देखना प्रासंगिक समारोह है

यदि कुछ भी है, तो मैं इसे अपने सॉकेट को साफ रूप से बंद करने के लिए HTTPResponse (या अनुरोध?) पर कर सकता हूं, मुझे वास्तव में पसंद आएगा जानना, क्योंकि यह कोड मेरे यूनिट परीक्षणों के लिए है; मुझे कहीं भी चेतावनियों को अनदेखा नहीं करना पसंद है, लेकिन विशेष रूप से वहां नहीं।

+1

मैं इसे पायथन 3.3.1 पर पुन: उत्पन्न नहीं कर सकता। क्या आप इसे नवीनतम पायथन संस्करण पर परीक्षण कर सकते हैं; [सॉकेट बंद करना] से संबंधित कुछ बग थे (http://bugs.python.org/issue12133) (टाइमआउट पर संसाधन चेतावनी) और ['" कनेक्शन: बंद करें "प्रतिक्रिया शीर्षलेख] (http: // bugs। python.org/issue12576) (दिखाता है कि शीर्षलेख के आधार पर अलग-अलग कोड पथ हैं)। – jfs

उत्तर

3

मुझे नहीं पता कि यह उत्तर है, लेकिन यह उत्तर के लिए एक तरीका है।

यदि मैं अपनी वेब सेवाओं से प्रतिक्रिया के लिए "कनेक्शन: बंद" हेडर जोड़ता हूं, तो HTTPResponse ऑब्जेक्ट चेतावनी के बिना ठीक से साफ हो जाता है।

और वास्तव में, HTTP युक्ति (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html) का कहना है:

HTTP/1.1 अनुप्रयोग जो लगातार कनेक्शन का समर्थन नहीं करना चाहिए हर संदेश में "बंद" कनेक्शन विकल्प शामिल हैं।

तो समस्या सर्वर अंत में थी (यानी मेरी गलती!)। यदि आप सर्वर से आने वाले शीर्षकों पर नियंत्रण नहीं रखते हैं, तो मुझे नहीं पता कि आप क्या कर सकते हैं।

संबंधित मुद्दे