Ubuntu下Python unittest跨目录相对导入失败求助
Python unittest跨目录导入问题解决方案
针对你描述的项目结构(/project下同级的/src和/tests,/src/aaa/bbb/foo.py对应/tests/aaa/bbb/test_foo.py),以下是可行的解决方案:
方法一:临时设置PYTHONPATH环境变量
在/project目录下执行操作:
- Linux/macOS:
- 临时添加项目根目录到Python路径:
export PYTHONPATH=$(pwd) - 运行测试:
python -m unittest tests/aaa/bbb/test_foo.py
- 临时添加项目根目录到Python路径:
- Windows CMD:
- 临时添加项目根目录到Python路径:
set PYTHONPATH=%cd% - 运行测试:
python -m unittest tests\aaa\bbb\test_foo.py
- 临时添加项目根目录到Python路径:
这种方式让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设置,一次性运行所有测试文件:
- 在
/project目录下设置PYTHONPATH(同方法一) - 执行命令:
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
相关产品推荐
相关产品推荐

