2013-02-18 5 views
7

私はテストしようとしているWebサービスからGETするためにurllib.request.urlopen()を使用しています。socket 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(またはRequest?)にできることがあれば、 私は本当に好きですこのコードは私の単体テストのためのものです。私は のどこにでも警告を無視したくないが、特にそこにはない。

+1

私はPython 3.3.1でそれを再現できません。あなたは最新のPythonバージョンでそれをテストできますか?ソケットを閉じる(http://bugs.python.org/issue12133)(ResourceWarning on timeout)と[Connection:close "' response header](http:// bugs)の2つのバグがありました。 python.org/issue12576)(ヘッダに応じて異なるコードパスがあることを示しています)。 – jfs

答えて

3

答えがかどうかわかりませんが、答えの途中です。

私のWebサービスからの応答にヘッダー "connection:close"を追加すると、HTTPResponseオブジェクトが警告なしに正しくクリーンアップされているようです。

実際には、HTTP仕様(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html)は言う:持続的な接続をサポートしていません

HTTP/1.1のアプリケーションは、すべてのメッセージで「クローズ」接続オプションを含まなければなりません。

問題はサーバー側で発生していました(つまり、私のエラーです)。サーバーからのヘッダーを制御できない場合は、自分ができることがわかりません。

関連する問題