在安装ryu时,由于4.34版本之后ryu不更新了,和现有的一些库会出现不兼容情况,特指eventlet库:
如果eventlet库回退到0.30.0以前版本的状态,eventlet库和3.10不兼容,报错如下:
$ ryu-manager --version
Traceback (most recent call last):
File "/root/sdn/ryu/venv/bin/ryu-manager", line 6, in <module>
from ryu.cmd.manager import main
File "/root/sdn/ryu/venv/lib/python3.10/site-packages/ryu/cmd/manager.py", line 22, in <module>
from ryu.lib import hub
File "/root/sdn/ryu/venv/lib/python3.10/site-packages/ryu/lib/hub.py", line 30, in <module>
import eventlet
File "/root/sdn/ryu/venv/lib/python3.10/site-packages/eventlet/__init__.py", line 10, in <module>
from eventlet import convenience
File "/root/sdn/ryu/venv/lib/python3.10/site-packages/eventlet/convenience.py", line 7, in <module>
from eventlet.green import socket
File "/root/sdn/ryu/venv/lib/python3.10/site-packages/eventlet/green/socket.py", line 4, in <module>
__import__('eventlet.green._socket_nodns')
File "/root/sdn/ryu/venv/lib/python3.10/site-packages/eventlet/green/_socket_nodns.py", line 11, in <module>
from eventlet import greenio
File "/root/sdn/ryu/venv/lib/python3.10/site-packages/eventlet/greenio/__init__.py", line 3, in <module>
from eventlet.greenio.base import * # noqa
File "/root/sdn/ryu/venv/lib/python3.10/site-packages/eventlet/greenio/base.py", line 32, in <module>
socket_timeout = eventlet.timeout.wrap_is_timeout(socket.timeout)
File "/root/sdn/ryu/venv/lib/python3.10/site-packages/eventlet/timeout.py", line 166, in wrap_is_timeout
base.is_timeout = property(lambda _: True)
TypeError: cannot set 'is_timeout' attribute of immutable type 'TimeoutError'
最新的eventlet库,报错如下:
$ ryu-manager --version
Traceback (most recent call last):
File "/root/sdn/ryu/venv/bin/ryu-manager", line 6, in <module>
from ryu.cmd.manager import main
File "/root/sdn/ryu/venv/lib/python3.10/site-packages/ryu/cmd/manager.py", line 33, in <module>
from ryu.app import wsgi
File "/root/sdn/ryu/venv/lib/python3.10/site-packages/ryu/app/wsgi.py", line 109, in <module>
class _AlreadyHandledResponse(Response):
File "/root/sdn/ryu/venv/lib/python3.10/site-packages/ryu/app/wsgi.py", line 111, in _AlreadyHandledResponse
from eventlet.wsgi import ALREADY_HANDLED
ImportError: cannot import name 'ALREADY_HANDLED' from 'eventlet.wsgi' (/root/sdn/ryu/venv/lib/python3.10/site-packages/eventlet/wsgi.py)
此时其实还是需要按照现在的版本,然后修改一行代码即可:这行代码,由于我使用了venv,所以环境是在venv中,如果你使用的不是venv,需要修改/root/sdn/ryu/venv/lib/python3.10/site-packages/eventlet/wsgi.py,然后找到from eventlet.wsgi import ALREADY_HANDLED,注释掉这一行,然后再其后添加:ALREADY_HANDLED = object(),修改完后保存即可:

再之后,就能用了:
$ ryu-manager --version
ryu-manager 4.34
















