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

Python2与Python3中Pytest行为差异及Python3导入问题解决咨询

为什么Python3下pytest找不到src模块?原因和解决方案

差异产生的原因

兄弟,这个问题我之前也踩过坑!核心差异在于Python3 下 pytest 处理模块搜索路径(sys.path)的逻辑和 Python2 不一样,再加上 Python3 对导入规则更严格:

  • 在 Python2 里,你运行python2 -m pytest时,pytest 会直接把当前工作目录(就是你的project文件夹)放到sys.path最前面。这样src作为project的子目录,自然能被 Python 当成顶层模块找到。
  • 但到了 Python3,pytest 默认会把测试文件所在的test目录加到sys.path的最前面。这时候你的测试代码里写import src.xxx,Python 会先去test目录里找src,肯定找不到啊,直接就报导入错误了。
    另外,Python3 砍掉了 Python2 支持的「隐式相对导入」,对导入路径的要求更严,这也让问题更容易出现。

解决方法

给你几个实用的方案,按需选就行:

1. 临时设置PYTHONPATH环境变量

运行 pytest 前,把project目录加到PYTHONPATH里,让 Python3 知道去哪找src:

  • Linux/macOS 终端:
    export PYTHONPATH=$(pwd):$PYTHONPATH
    python3 -m pytest
    
  • Windows 命令提示符:
    set PYTHONPATH=%cd%;%PYTHONPATH%
    python3 -m pytest
    

这种方式简单直接,适合临时测试。

2. 在测试文件里手动添加路径

如果不想改环境变量,可以在每个测试文件开头加几行代码,把project目录塞进sys.path:

import sys
from pathlib import Path

# 拿到project目录的绝对路径(假设测试文件在test下,往上跳两级就是project)
project_root = Path(__file__).parent.parent
sys.path.append(str(project_root))

这种方法不需要外部配置,适合单个测试文件的调整。

3. 用pytest配置文件永久解决(最推荐)

在project目录下新建一个pytest.ini文件,内容如下:

[pytest]
pythonpath = .

这个配置会告诉 pytest,把当前目录(也就是project)加到sys.path里,和 Python2 下的行为完全一致。配置一次之后,以后跑python3 -m pytest就再也不会出问题了,长期用最省心。

4. 显式相对导入(不推荐)

如果你的测试结构和src严格对应,也可以用显式相对导入,比如:

from ..src import your_module

但这种方式很容易因为 pytest 的运行上下文出问题,比如如果直接单独运行某个测试文件就会报错,所以一般不推荐用这种。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:30:11