在安装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 mainFile "/root/sdn/ryu/venv/lib/python3.10/site-packages/ryu/cmd/manager.py", line 22, in <module>from ryu.lib import hubFile "/root/sdn/ryu/venv/lib/python3.10/site-packages/ryu/lib/hub.py", line 30, in <module>import eventletFile "/root/sdn/ryu/venv/lib/python3.10/site-packages/eventlet/__init__.py", line 10, in <module>from eventlet import convenienceFile "/root/sdn/ryu/venv/lib/python3.10/site-packages/eventlet/convenience.py", line 7, in <module>from eventlet.green import socketFile "/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 greenioFile "/root/sdn/ryu/venv/lib/python3.10/site-packages/eventlet/greenio/__init__.py", line 3, in <module>from eventlet.greenio.base import *  # noqaFile "/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_timeoutbase.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 mainFile "/root/sdn/ryu/venv/lib/python3.10/site-packages/ryu/cmd/manager.py", line 33, in <module>from ryu.app import wsgiFile "/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 _AlreadyHandledResponsefrom 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(),修改完后保存即可:

image.png

再之后,就能用了:

$ ryu-manager --version
ryu-manager 4.34