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

Ubuntu下Python unittest跨目录相对导入失败求助

Python unittest跨目录导入问题解决方案

针对你描述的项目结构(/project下同级的/src和/tests,/src/aaa/bbb/foo.py对应/tests/aaa/bbb/test_foo.py),以下是可行的解决方案:

方法一:临时设置PYTHONPATH环境变量

在/project目录下执行操作:

  • Linux/macOS:
    1. 临时添加项目根目录到Python路径:export PYTHONPATH=$(pwd)
    2. 运行测试:python -m unittest tests/aaa/bbb/test_foo.py
  • Windows CMD:
    1. 临时添加项目根目录到Python路径:set PYTHONPATH=%cd%
    2. 运行测试:python -m unittest tests\aaa\bbb\test_foo.py

这种方式让Python直接识别src作为顶级模块,无需修改测试文件代码。

方法二:在测试文件中动态添加项目根目录到sys.path

修改test_foo.py,用绝对路径而非相对字符串添加路径:

import sys
from pathlib import Path
import unittest

# 从当前测试文件的路径向上回溯到项目根目录(/project)
project_root = Path(__file__).resolve().parent.parent.parent.parent
sys.path.append(str(project_root))

from src.aaa.bbb import foo

class TestFoo(unittest.TestCase):
    # 测试用例示例
    def test_sample(self):
        self.assertEqual(foo.some_func(), expected_result)

if __name__ == '__main__':
    unittest.main()

修改后可直接在/project目录下运行:python tests/aaa/bbb/test_foo.py

方法三:用unittest自动发现测试(推荐)

结合PYTHONPATH设置,一次性运行所有测试文件:

  1. 在/project目录下设置PYTHONPATH(同方法一)
  2. 执行命令:python -m unittest discover -s tests -p "test_*.py"
    该命令会自动扫描tests目录下所有符合命名规则的测试文件并执行。

为什么之前的方法失效?

  • 用sys.path.append("....")时,Python的工作目录是/project,....会指向/project的上级目录,自然找不到src模块;
  • 相对导入from ....src.aaa.bbb import foo失效,是因为直接运行测试文件时,它被当作独立脚本而非包的一部分,Python无法识别其父包结构,必须通过-m参数以模块方式运行,且需确保项目根目录在Python路径中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:05:56