Flask项目中pytest无法识别模块导入的问题求助
Flask + Pytest 导入问题解决方案
问题核心
你的项目结构中src为核心代码目录,tests独立于src之外。pytest无法识别路由或main.py中的导入,本质是pytest运行时的模块搜索路径未包含backend根目录,导致Python无法将src识别为可导入的包。
具体解决步骤
1. 统一使用绝对导入(推荐)
放弃相对导入,所有导入均基于src包的绝对路径:
- 在
budget_routes.py中导入database:from src.database import 你需要的对象 - 在
main.py中导入路由:from src.routes.budget_routes import 你的路由蓝图/函数
2. 让pytest识别src包
任选以下一种方法即可:
方法一:临时设置PYTHONPATH(快速验证)
在backend目录下执行命令:
- Linux/macOS:
PYTHONPATH=. pytest - Windows(PowerShell):
$env:PYTHONPATH="."; pytest
该命令会临时将backend目录加入Python模块搜索路径,pytest即可识别src包。
方法二:用conftest.py自动配置路径(长期方案)
在tests目录下创建conftest.py文件,内容如下:
import sys from pathlib import Path # 获取backend根目录的绝对路径 backend_root = Path(__file__).parent.parent sys.path.append(str(backend_root))
pytest运行时会自动加载此文件,将backend目录加入模块搜索路径,无需每次手动设置环境变量。
疑问解答
- 为什么带
src前缀的导入能运行?
直接运行main.py时,IDE可能已自动将backend设为项目根目录,或你手动通过sys.path添加了src路径,因此Python能识别src作为模块。但pytest默认不会继承IDE的路径配置,需手动设置。 - 为什么相对导入不行?
相对导入(如from ..database import ...)仅能在包内部使用。pytest运行测试文件时,会将测试文件视为顶层模块,src/routes的包结构被打破,无法识别上层的database模块。
内容的提问来源于stack exchange,提问作者Sidra I
相关产品推荐
相关产品推荐

