FastAPI项目uvicorn启动报ModuleNotFoundError,手动运行正常
检查导入语句的正确性
打开data_classifier/classification_pipeline.py,查看导入prompts的代码:- 如果用的是
import prompts,这种写法依赖当前文件所在目录的模块搜索路径,直接运行该文件时生效,但uvicorn从项目根目录启动时,Python会在根目录查找prompts.py,自然找不到。改成相对导入from . import prompts(前提是prompts.py和classification_pipeline.py在同一目录),或者绝对导入from data_classifier import prompts即可。
- 如果用的是
确认启动命令的工作目录
确保你是在项目根目录下执行uvicorn main:app --reload。如果在子目录(比如data_classifier/下)启动,Python的模块搜索路径会以当前子目录为基准,无法正确识别上层目录的包结构,导致找不到模块。排查文件结构变更
回忆最近是否移动过prompts.py的位置,或者调整过data_classifier目录的层级?比如之前prompts.py在项目根目录,现在移到data_classifier下,但导入语句未同步修改,就会导致启动时找不到。对比两种启动方式的sys.path差异
在classification_pipeline.py开头添加以下代码,分别在直接运行和uvicorn启动时查看输出:import sys print("当前sys.path:", sys.path)直接运行该文件时,
data_classifier目录会被加入sys.path;而uvicorn启动时,如果项目根目录不在sys.path中,或者data_classifier未被识别为Python包,就会找不到模块。如果是这个问题,可以在main.py开头手动把项目根目录加入sys.path:import sys from pathlib import Path sys.path.append(str(Path(__file__).parent))检查命名冲突
排查是否新增了与prompts.py同名的文件(比如项目根目录下新建了prompts.py),或者误安装了名为prompts的第三方包。执行pip list查看已安装包,如有同名包,卸载即可:pip uninstall prompts。验证__init__.py文件状态
虽然Python 3.3+不需要__init__.py就能识别包,但如果之前data_classifier目录有该文件,最近被删除或修改过,可能影响包的导入逻辑。可以尝试在data_classifier目录下新建一个空的__init__.py文件测试。
内容的提问来源于stack exchange,提问作者MAckenzie

