Python 2.7.9+gevent

No Gravatar

Python 2.7.9+gevent会出问题。
如果你使用gevent 1.0 ,比如你使用Ubuntu 14.10,使用apt-get安装的缺省版本就是它,报的错误是:global name SSLContext not defined.这个路线我现在还没有分析。
如果你使用gevent 1.0.1,同样在Ubuntu 14.10,使用sudo easy_install -U gevent,安装的版本是目前gevent的最新版本1.0.1。提示的错误是:global name sslwrap not defined。

根据Debian的bug report,这个问题已经出现好长时间了。

Google的解决方案如下:
1. https://gist.github.com/ellimilial/5ef1d1917e00970d4457

sudo apt-get install python-dev cython git python-pip
sudo pip install git+git://github.com/ellimilial/gevent.git@master

not work。因为网络的原故,从github直接这么安装着实是慢得要死。

2. https://github.com/gevent/gevent/issues/477
这里面提供的代码经过测试是好用的,前提是使用gevent的最新1.0.1版本。

gist地址:https://gist.github.com/zz/af7d9efa539999757950

代码如下:

# Re-add sslwrap to Python 2.7.9
import inspect
__ssl__ = __import__('ssl')

try:
    _ssl = __ssl__._ssl
except AttributeError:
    _ssl = __ssl__._ssl2

def new_sslwrap(sock, server_side=False, keyfile=None, certfile=None, cert_reqs=__ssl__.CERT_NONE,  ssl_version=__ssl__.PROTOCOL_SSLv23, ca_certs=None, ciphers=None):
    context = __ssl__.SSLContext(ssl_version)
    context.verify_mode = cert_reqs or __ssl__.CERT_NONE
    if ca_certs:
        context.load_verify_locations(ca_certs)
    if certfile:
        context.load_cert_chain(certfile, keyfile)
    if ciphers:
        context.set_ciphers(ciphers)

    caller_self = inspect.currentframe().f_back.f_locals['self']
    return context._wrap_socket(sock, server_side=server_side, ssl_sock=caller_self)

if not hasattr(_ssl, 'sslwrap'):
    _ssl.sslwrap = new_sslwrap

考虑到使用方便,可以使用下面代码(因为这条import当时忘记了,结果又重新修改了一下)

# Re-add sslwrap to Python 2.7.9
import inspect

def new_sslwrap(sock, server_side=False, keyfile=None, certfile=None, cert_reqs=__ssl__.CERT_NONE,  ssl_version=__ssl__.PROTOCOL_SSLv23, ca_certs=None, ciphers=None):
    context = __ssl__.SSLContext(ssl_version)
    context.verify_mode = cert_reqs or __ssl__.CERT_NONE
    if ca_certs:
        context.load_verify_locations(ca_certs)
    if certfile:
        context.load_cert_chain(certfile, keyfile)
    if ciphers:
        context.set_ciphers(ciphers)

    caller_self = inspect.currentframe().f_back.f_locals['self']
    return context._wrap_socket(sock, server_side=server_side, ssl_sock=caller_self)

if not hasattr(_ssl, 'sslwrap'):
    _ssl.sslwrap = new_sslwrap

加到这段代码之下:

try:
    _ssl = __ssl__._ssl
except AttributeError:
    _ssl = __ssl__._ssl2

修改文件的位置:/usr/local/lib/python2.7/dist-packages/gevent-1.0.1-py2.7-linux-x86_64.egg/gevent
文件名:ssl.py

记得Ubuntu下使用gksu来应用权限。

此记。
———-
为什么会遇到这个问题:之前一篇文章说使用gevent速度会快些。已经加上了,速度什么的没有体会,反倒让这个问题折腾了,太喜爱技术的问题,以后还是少点发散吧。

No Gravatar

许多年前写下的:

仿佛轻云应笑我
相携水岸弄朝霞
此生只为听天籁
坐拥书城看落花

现在其中第三句似乎可以换成“驰骋山林听天籁”

仿佛轻云应笑我
相携水岸弄朝霞
驰骋山林听天籁
坐拥书城看落花

稍嫌过工。

一人食

No Gravatar

一人食

便许推窗对嵯峨
林涛阵阵吹雨雪
谁家珠玉湖边坐
怎恋得花落?
怎听得他说?
算是茶冷饭凉易看破
合书长啸两相悦

2014.11.18日晚听糖糖的拉风车生活,说要送一本叫做《一人食》的书。具体讲什么不重要了,便想写点什么。

+++仿佛轻云应笑我–相携水岸弄朝霞–此生只为听天籁–坐拥书城看落花+++