CentOS 7运行FastAPI应用遇asyncio模块AttributeError求助
问题分析与解决方案
问题根源
你的错误AttributeError: module 'asyncio' has no attribute 'run'完全是Python版本导致的:
asyncio.run()是Python 3.7及以上版本才新增的API,而你使用的Python 3.6.8并不支持这个方法- 你安装的最新版uvicorn已经放弃了对Python 3.6的兼容,内部代码直接调用了这个高版本API
解决方案
方案1:降级uvicorn到兼容Python 3.6的版本
这是最快的临时解决办法,选择最后一批支持Python3.6的uvicorn版本:
- 先卸载当前的uvicorn:
pip3 uninstall -y uvicorn - 安装指定兼容版本:
pip3 install uvicorn==0.16.0 - 重新启动应用:
python3 -m uvicorn main:app
方案2:升级Python到3.7+(推荐长期方案)
Python 3.6已经停止官方维护,升级到更高版本不仅能解决这个问题,还能获得更多新特性和安全补丁:
在CentOS 7上可以通过SCL源安装高版本Python:
- 安装CentOS SCL源:
sudo yum install -y centos-release-scl - 安装Python 3.8(也可以选3.9/3.10等):
sudo yum install -y rh-python38 - 启用Python 3.8环境(每次会话都需要执行,或者加到bashrc里):
scl enable rh-python38 bash - 创建并激活新的虚拟环境(可选但推荐):
python -m venv fastapi-venv source fastapi-venv/bin/activate - 安装FastAPI和最新版uvicorn:
pip install fastapi uvicorn - 启动应用:
uvicorn main:app
额外说明
之前的No module named uvicorn错误是因为虚拟环境中没有安装依赖,后续操作尽量在激活虚拟环境后执行,避免全局依赖冲突。
错误回溯信息:
Traceback (most recent call last): File "/usr/lib64/python3.6/runpy.py", line 193, in _run_module_as_main "__main__", mod_spec) File "/usr/lib64/python3.6/runpy.py", line 85, in _run_code exec(code, run_globals) File "/usr/local/lib/python3.6/site-packages/uvicorn/__main__.py", line 4, in <module> uvicorn.main() File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1128, in __call__ return self.main(*args, **kwargs) File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1053, in main rv = self.invoke(ctx) File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1395, in invoke return ctx.invoke(self.callback, **ctx.params) File "/usr/local/lib/python3.6/site-packages/click/core.py", line 754, in invoke return __callback(*args, **kwargs) File "/usr/local/lib/python3.6/site-packages/uvicorn/main.py", line 435, in main run(app, **kwargs) File "/usr/local/lib/python3.6/site-packages/uvicorn/main.py", line 461, in run server.run() File "/usr/local/lib/python3.6/site-packages/uvicorn/server.py", line 67, in run return asyncio.run(self.serve(sockets=sockets)) AttributeError: module 'asyncio' has no attribute 'run'
内容的提问来源于stack exchange,提问作者Kelvin Lawson
相关产品推荐
相关产品推荐

