2016-09-05 85 views
0

當我使用gevent時,我不能使用requests,是我的用法錯誤嗎?python3全局名稱'SOL_SOCKET未定義

from gevent import monkey; monkey.patch_all() 
import gevent, requests 
requests.get('https://haofly.net') 

它引發錯誤:

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/usr/local/lib/python3.3/site-packages/requests/api.py", line 70, in get 
    return request('get', url, params=params, **kwargs) 
File "/usr/local/lib/python3.3/site-packages/requests/api.py", line 56, in request 
    return session.request(method=method, url=url, **kwargs) 
File "/usr/local/lib/python3.3/site-packages/requests/sessions.py", line 475, in request 
    resp = self.send(prep, **send_kwargs) 
File "/usr/local/lib/python3.3/site-packages/requests/sessions.py", line 596, in send 
    r = adapter.send(request, **kwargs) 
    File "/usr/local/lib/python3.3/site-packages/requests/adapters.py", line 423, in send 
    timeout=timeout 
    File "/usr/local/lib/python3.3/site-packages/requests/packages/urllib3/connectionpool.py", line 595, in urlopen 
    chunked=chunked) 
File "/usr/local/lib/python3.3/site-packages/requests/packages/urllib3/connectionpool.py", line 352, in _make_request 
    self._validate_conn(conn) 
File "/usr/local/lib/python3.3/site-packages/requests/packages/urllib3/connectionpool.py", line 831, in _validate_conn 
    conn.connect() 
File "/usr/local/lib/python3.3/site-packages/requests/packages/urllib3/connection.py", line 289, in connect 
    ssl_version=resolved_ssl_version) 
File "/usr/local/lib/python3.3/site-packages/requests/packages/urllib3/util/ssl_.py", line 308, in ssl_wrap_socket 
    return context.wrap_socket(sock, server_hostname=server_hostname) 
File "/usr/local/lib/python3.3/site-packages/gevent/_ssl3.py", line 60, in wrap_socket 
    _context=self) 
File "/usr/local/lib/python3.3/site-packages/gevent/_ssl3.py", line 143, in __init__ 
    if sock.getsockopt(SOL_SOCKET, SO_TYPE) != SOCK_STREAM: 
NameError: global name 'SOL_SOCKET' is not defined 

我的Python的版本是3.3

如果我添加ssl=Falsemonkey.patch_all(),它返回:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python3.3/site-packages/requests/api.py", line 70, in get 
    return request('get', url, params=params, **kwargs) 
    File "/usr/local/lib/python3.3/site-packages/requests/api.py", line 56, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "/usr/local/lib/python3.3/site-packages/requests/sessions.py", line 475, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/usr/local/lib/python3.3/site-packages/requests/sessions.py", line 596, in send 
    r = adapter.send(request, **kwargs) 
    File "/usr/local/lib/python3.3/site-packages/requests/adapters.py", line 423, in send 
    timeout=timeout 
    File "/usr/local/lib/python3.3/site-packages/requests/packages/urllib3/connectionpool.py", line 595, in urlopen 
    chunked=chunked) 
    File "/usr/local/lib/python3.3/site-packages/requests/packages/urllib3/connectionpool.py", line 352, in _make_request 
    self._validate_conn(conn) 
    File "/usr/local/lib/python3.3/site-packages/requests/packages/urllib3/connectionpool.py", line 831, in _validate_conn 
    conn.connect() 
    File "/usr/local/lib/python3.3/site-packages/requests/packages/urllib3/connection.py", line 289, in connect 
    ssl_version=resolved_ssl_version) 
    File "/usr/local/lib/python3.3/site-packages/requests/packages/urllib3/util/ssl_.py", line 308, in ssl_wrap_socket 
    return context.wrap_socket(sock, server_hostname=server_hostname) 
    File "/usr/local/lib/python3.3/ssl.py", line 245, in wrap_socket 
    _context=self) 
    File "/usr/local/lib/python3.3/ssl.py", line 335, in __init__ 
    server_hostname) 
TypeError: _wrap_socket() argument 1 must be _socket.socket, not SSLSocket 
+1

有趣。該名稱將在'ssl'模塊中找到並導入。我看到Python 3.3被支持;你安裝了哪個版本的openssl? –

+0

@MartijnPieters \t 你的意思是linux包openssl?我的openssl是openssl-1.0.1e-48.el6_8.1.x86_64,CentOS 6.8 – haofly

+0

問題是,顯然'從ssl導入SOL_SOCKET'爲您的安裝失敗。爲什麼這是我不完全理解。也許你在某處有一個影子'ssl'模塊? 'import ssl;例如,print(ssl .__ file __)'應該打印一個系統位置。 –

回答

2

這真是一個gevent中的bug。它試圖從ssl庫中導入socket constant

該特定常數發生將被導入到ssl庫中,因爲該庫使用它。但它只是在那裏,因爲修復issue 19422需要將其導入ssl模塊。該錯誤的修復已包含在Python 3.3.4中,並且您有版本3.3.3,因此您在ssl模塊中也沒有該特定的常量。

您可以通過在gevent/_ssl3.py(位於系統上的/usr/local/lib/python3.3/site-packages目錄中)中添加from socket import SOL_SOCKET, SO_TYPE來修復該問題。或者你可以升級到Python 3.3.4或更新的版本。

我已將此項作爲issue #856gevent項目一起提交。

0

安裝Python 3.5版本可以解決這個問題。