在安装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(),修改完后保存即可:

image.png

再之后,就能用了:

$ ryu-manager --version
ryu-manager 4.34