Ubuntu安装Ryu控制器报错:无法设置TimeoutError的is_timeout属性
Ryu控制器运行ryu-manager报错的解决方法
报错信息(中文翻译)
回溯(最近的调用最后): 文件 "/home/jeo/.local/bin/ryu-manager", 第5行, 在<module>中 from ryu.cmd.manager import main 文件 "/home/jeo/.local/lib/python3.10/site-packages/ryu/cmd/manager.py", 第22行, 在<module>中 from ryu.lib import hub 文件 "/home/jeo/.local/lib/python3.10/site-packages/ryu/lib/hub.py", 第30行, 在<module>中 import eventlet 文件 "/home/jeo/.local/lib/python3.10/site-packages/eventlet/__init__.py", 第17行, 在<module>中 from eventlet import convenience 文件 "/home/jeo/.local/lib/python3.10/site-packages/eventlet/convenience.py", 第7行, 在<module>中 from eventlet.green import socket 文件 "/home/jeo/.local/lib/python3.10/site-packages/eventlet/green/socket.py", 第4行, 在<module>中 __import__('eventlet.green._socket_nodns') 文件 "/home/jeo/.local/lib/python3.10/site-packages/eventlet/green/_socket_nodns.py", 第11行, 在<module>中 from eventlet import greenio 文件 "/home/jeo/.local/lib/python3.10/site-packages/eventlet/greenio/__init__.py", 第3行, 在<module>中 from eventlet.greenio.base import * # noqa 文件 "/home/jeo/.local/lib/python3.10/site-packages/eventlet/greenio/base.py", 第32行, 在<module>中 socket_timeout = eventlet.timeout.wrap_is_timeout(socket.timeout) 文件 "/home/jeo/.local/lib/python3.10/site-packages/eventlet/timeout.py", 第166行, 在wrap_is_timeout中 base.is_timeout = property(lambda _: True) 类型错误:无法为不可变类型'TimeoutError'设置'is_timeout'属性
问题原因
Python 3.10版本中,socket.timeout被重命名为内置的TimeoutError,而TimeoutError是不可变类型。旧版本的eventlet库尝试给这个不可变类型添加自定义属性,触发了上述错误。
解决步骤
- 卸载旧版eventlet,安装兼容Python 3.10的新版本(eventlet 0.33.0及以上修复了该问题):
pip uninstall eventlet -y pip install eventlet>=0.33.0
- 若问题仍存在,升级Ryu到最新兼容版本:
pip install --upgrade ryu
- 验证:运行
ryu-manager,检查是否正常启动。
内容的提问来源于stack exchange,提问作者Pumpkin
相关产品推荐
相关产品推荐

