You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:56:21