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

Pytest如何指定包根目录?解决相对导入越界报错

问题描述

项目结构(简化版):

my-project
   ├── __init__.py
   ├── my_code.py
   └── tests
       ├── __init__.py
       └── test_foo.py

在my-project目录内执行pytest .,或在其父目录执行pytest my-project时,Python会将tests目录视为根目录,导致test_foo.py中的相对导入语句from ..my_code import *触发报错:ImportError: attempted relative import beyond top-level package。

限制条件:

  • 不能使用绝对路径(my-project作为子目录存在于其他项目中,绝对路径无法跨项目解析)
  • 不想通过打包解决,避免额外管理成本
解决方法

方法1:添加pytest配置文件(推荐)

在my-project目录下创建pytest.ini文件,写入以下内容:

[pytest]
testpaths = tests
pythonpath = .

这个配置会让pytest把my-project目录加入Python的模块搜索路径,无论你在my-project内部还是父目录执行pytest,都能正确识别my-project为顶层包,相对导入就能正常工作。

方法2:执行pytest时临时设置Python路径

  • 在my-project目录内执行:
    PYTHONPATH=. pytest .
    
  • 在my-project的父目录执行:
    PYTHONPATH=. pytest my-project
    

这种方式不需要创建额外文件,适合临时测试场景。

方法3:修改测试文件代码(可选)

如果不想改配置或环境变量,可以在test_foo.py开头添加代码,手动把my-project目录加入路径:

import sys
from pathlib import Path

# 获取my-project目录的绝对路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))

# 之后可直接导入my_code
from my_code import *

不过这种方式需要修改测试文件代码,不如前两种优雅。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:37:13