FastAPI项目通过uvicorn启动时报attempted relative import错误如何解决?
报错产生原因
当你直接在项目根目录执行uvicorn main:app --reload启动项目时,Python会将当前运行的main.py识别为顶级入口模块(即__main__模块),而非某个Python包下的子模块。此时代码中使用.开头的相对导入语法,Python无法定位到该模块所属的父包,就会触发该ImportError。
可用修复方案
方案1:修改为绝对导入(小型项目首选)
不需要调整启动命令,直接修改main.py中的导入语句即可:from fastapi import FastAPI from typing import Optional # 删掉相对导入的点,改为直接导入模块名 import schemas, models from database import engine app = FastAPI() # more code here...修改完成后直接运行原启动命令
uvicorn main:app --reload即可正常启动。方案2:调整启动命令,将项目作为包运行(符合Python包规范)
不需要修改现有代码,先退到你当前项目文件夹的上一级目录,假设你的项目文件夹名称为fastapi_demo,执行以下启动命令即可:uvicorn fastapi_demo.main:app --reload
这种方式会将你的项目文件夹识别为合法的Python包,相对导入语法就能正常生效。方案3:新增项目统一入口(适合后续项目扩展、打包场景)
在当前项目根目录新建__main__.py文件,写入以下内容:import uvicorn if __name__ == "__main__": uvicorn.run("main:app", reload=True)之后直接在项目根目录执行
python -m .即可启动项目,原有相对导入逻辑不需要修改。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

