bottle 使用 gevent 库 cannot import name wsgi

示例代码

from gevent import monkey
monkey.patch_all()
from bottle import Bottle

app = Bottle()


@app.route('/')
def index():
    return 'Hello Bottle!'


app.run(host='0.0.0.0', port=80, server='gevent')

以前一直都这么用的,没遇到问题。但是,最近使用python 3.6然后安装了bottlegevent库,执行的时候却抛出异常:
bottle 使用 gevent 库 cannot import name wsgi_第1张图片

看GitHub解释是因为新版本gevent废除了wsgi,直接用pywsgi就好了。所以参照修改建议,根据错误提示打开bottle.py文件,定位到异常位置,如图:
bottle 使用 gevent 库 cannot import name wsgi_第2张图片
对这几行代码进行简单修改,删除掉对wsgi的引用,修改后:

class GeventServer(ServerAdapter):
    """ Untested. Options:

        * See gevent.wsgi.WSGIServer() documentation for more options.
    """
    def run(self, handler):
        from gevent import pywsgi, local
        if not isinstance(threading.local(), local.local):
            msg = "Bottle requires gevent.monkey.patch_all() (before import)"
            raise RuntimeError(msg)
        if self.quiet:
            self.options['log'] = None
        address = (self.host, self.port)
        server = pywsgi.WSGIServer(address, handler, **self.options)
        if 'BOTTLE_CHILD' in os.environ:
            import signal
            signal.signal(signal.SIGINT, lambda s, f: server.stop())
        server.serve_forever()

保存,然后再次运行脚本,可以看到,程序正常启动了:
bottle 使用 gevent 库 cannot import name wsgi_第3张图片

参考资料:

问题分析 :https://github.com/bottlepy/bottle/issues/1065
解决方案 :https://github.com/bottlepy/bottle/commit/cafc15419cbb4a6cb748e6ecdccf92893bb25ce5

你可能感兴趣的:(Python,bottle,gevent,cannot,import,name,wsgi)