Python运行FastAPI报错:无法从typing_extensions导入ParamSpec
问题场景
使用FastAPI开发接口服务时,运行基础测试代码触发运行错误,测试代码如下:
from fastapi import FastAPI import uvicorn app = FastAPI() @app.get("/ping") async def ping(): return "Hello, I am alive" if __name__ == "__main__": uvicorn.run(app, host='localhost', port=8000)
错误信息
运行代码后程序抛出完整错误追踪栈如下,核心报错为 无法从typing_extensions模块导入ParamSpec:
Traceback (most recent call last): File "D:/own_thesis/training/for_api.py", line 2, in <module> from fastapi import FastAPI File "C:\Users\USER\AppData\Local\Programs\Python\Python37\lib\site-packages\fastapi\__init__.py", line 7, in <module> from .applications import FastAPI as FastAPI File "C:\Users\USER\AppData\Local\Programs\Python\Python37\lib\site-packages\fastapi\applications.py", line 15, in <module> from fastapi = routing File "C:\Users\USER\AppData\Local\Programs\Python\Python37\lib\site-packages\fastapi\routing.py", line 22, in <module> from fastapi.datastructures import Default, DefaultPlaceholder File "C:\Users\USER\AppData\Local\Programs\Python\Python37\lib\site-packages\fastapi\datastructures.py", line 3, in <module> from starlette.datastructures import URL as URL # noqa: F401 File "C:\Users\USER\AppData\Local\Programs\Python\Python37\lib\site-packages\starlette\datastructures.py", line 7, in <module> from starlette.concurrency import run_in_threadpool File "C:\Users\USER\AppData\Local\Programs\Python\Python37\lib\site-packages\starlette\concurrency.py", line 11, in <module> from typing_extensions import ParamSpec ImportError: cannot import name 'ParamSpec' from 'typing_extensions' (C:\Users\USER\AppData\Local\Programs\Python\Python37\lib\site-packages\typing_extensions.py)
产生原因
- 当前代码运行在Python 3.7环境下,FastAPI依赖的底层Web框架Starlette的较新版本,在并发逻辑模块中需要从
typing_extensions导入ParamSpec类型 - 环境中已安装的
typing_extensions版本过低(低于4.0.0),ParamSpec是typing_extensions4.0.0版本才新增的类型,低版本无该导出项,因此触发导入错误 - 同类问题的其他可能诱因:如果项目根目录下存在自定义命名为
typing_extensions.py的文件,会因为Python模块导入优先级覆盖官方安装的依赖包触发同类错误,从当前错误路径判断本次问题属于版本不兼容导致。
修复方案
可根据自身环境情况选择对应方案解决:
- 方案1(最快修复):直接升级
typing_extensions到兼容版本,在终端执行如下命令:
升级完成后重新运行代码即可正常启动服务。pip install --upgrade "typing_extensions>=4.0.0" - 方案2(适配Python3.7存量环境):如果Python3.7环境下升级
typing_extensions会引发其他依赖冲突,可以安装适配Python3.7的FastAPI历史稳定版本,执行命令:
该版本绑定的Starlette依赖不会强制要求高版本pip install fastapi==0.95.2 uvicorntyping_extensions,可直接在Python3.7环境下运行。 - 方案3(长期维护推荐):将Python运行环境升级到3.8及以上版本,高版本Python的标准库
typing模块已内置ParamSpec类型,不会出现该类导入问题;同时当前FastAPI新版本已逐步停止对Python3.7的维护支持,升级Python版本可避免后续出现更多依赖兼容问题。
内容的提问来源于stack exchange,提问作者Shadman Shakib
相关产品推荐
相关产品推荐

