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

解决pytest运行时sys.path引发的src模块导入失败问题

问题场景

项目目录结构

<root>
+-- src
|    +- module1.py
|    |
|    +- module2.py
|    |
|    + __init__.py
|
+-- test
     +- test1
     |    +- test1.py
     |    |
     |    + __init__.py
     |
     +- test2.py
     |
     +- __init__.py

相关文件内容

  • test/__init__.py 代码:
    import sys
    sys.path.append(".")
    
  • test/test1/__init__.py 代码:
    import sys
    sys.path.append("..")
    
  • test/test1/test1.py 和 test/test2.py 均包含导入语句:
    from src import module1, module2
    

问题现象

在项目根目录执行 pytest test1 时一切正常,但执行 pytest 时,test2 会因无法解析 src 模块而在导入语句处失败。

已尝试的无效操作:

  • 修改 test/__init__.py,将 ".." 添加到 sys.path 中
  • 改用相对导入语句 from ..src import module1, module2
解决方案

方案1:将项目安装为可编辑模式(推荐)

在项目根目录执行以下命令:

pip install -e .

此操作会把 src 注册为系统可识别的 Python 包,无论从哪个目录运行 pytest,都能直接导入 src 下的模块,无需手动修改 sys.path,这是最符合 Python 包规范的做法。

方案2:通过 conftest.py 统一配置路径

在项目根目录创建 conftest.py 文件,写入以下代码:

import sys
from pathlib import Path

# 获取项目根目录的绝对路径
root_path = Path(__file__).absolute().parent
sys.path.append(str(root_path))

pytest 会自动加载根目录下的 conftest.py,将根目录加入 sys.path,这样所有测试文件中的 from src import ... 语句都能正常解析,不管是执行 pytest 还是 pytest test1 都能生效。

方案3:在测试文件中动态添加根目录(不推荐)

如果暂时不想用上面两种规范方案,可以在每个测试文件开头添加路径配置代码:

import sys
from pathlib import Path

# 根据测试文件位置计算根目录:test2.py 需取父级的父级,test1.py 需取父级的父级的父级
root_dir = Path(__file__).resolve().parent.parent  # 针对 test2.py
# root_dir = Path(__file__).resolve().parent.parent.parent  # 针对 test1.py
sys.path.append(str(root_dir))

from src import module1, module2

这种方法需要根据测试文件的层级调整路径计算逻辑,维护成本较高,仅适合临时场景使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:11:03