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

Pytest测试Python项目遇ModuleNotFoundError:模块内导入失败求助

解决Pytest测试时ModuleNotFoundError:找不到module2的问题

问题根源

你遇到的问题是导入路径的上下文不一致导致的:

  • 直接运行项目脚本时,Python的工作目录通常是src/myproject/(或通过main.py启动,此时myproject作为包存在,内部模块的导入逻辑能正常工作);
  • 但用Pytest运行测试时,工作目录是项目根目录,即便你在test_module1.py里把src加入sys.path,module1.py里的import module2是尝试从顶级路径搜索module2,而module2实际属于myproject包,自然会找不到。

你之前尝试的from . import module2是相对导入,理论上应该生效,但可能因为测试时的导入方式(从myproject.module1导入)和直接运行module1.py的场景冲突,或者Pytest的导入机制细节导致失效,下面给出更稳妥的解决方法:

解决方案

方案1:改用绝对导入(推荐)

修改module1.py里的导入语句,从:

import module2

改为基于项目包的绝对导入:

from myproject import module2

这样不管是直接运行项目,还是通过Pytest测试,Python都会从src目录下的myproject包中查找module2,完全避免路径上下文的问题。

方案2:通过PYTHONPATH环境变量指定src路径

在运行Pytest前,先设置环境变量把src目录加入Python的模块搜索路径:

  • Linux/macOS终端:
export PYTHONPATH=./src && pytest tests/test_module1.py
  • Windows命令行:
set PYTHONPATH=./src && pytest tests/test_module1.py
  • Windows PowerShell:
$env:PYTHONPATH = "./src"; pytest tests/test_module1.py

设置后,Python会把src视为顶级模块目录,myproject作为顶级包,此时module1.py里的import module2会被解析为myproject.module2,就能正常找到。

方案3:用conftest.py统一配置路径

在tests目录下创建conftest.py文件,内容如下:

import sys
from pathlib import Path

# 获取项目根目录下的src路径并加入sys.path
src_path = str(Path(__file__).parent.parent / "src")
if src_path not in sys.path:
    sys.path.append(src_path)

这样所有测试文件都会自动继承这个路径配置,不用在单个测试文件里重复写sys.path的代码,同时确保导入路径的一致性。

额外说明

如果你需要保留module1.py可以直接运行的能力(比如python src/myproject/module1.py),可以在module1.py开头加入一段路径适配代码:

import sys
from pathlib import Path

# 如果是直接运行该脚本,把上级目录加入sys.path
if __name__ == "__main__":
    sys.path.append(str(Path(__file__).parent.parent))

from myproject import module2

这样既不影响测试时的绝对导入,也能支持直接运行脚本。

内容的提问来源于stack exchange,提问作者nos codemos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:57:12