保持目录结构前提下解决单元测试模块b导入失败问题
解决Python单元测试的模块导入问题(保持目录结构不变)
这个问题我之前踩过坑,核心就是Python的模块搜索路径没配置对,咱们几个方案都能解决,而且完全不用改你现有的目录结构:
方案1:调整内部导入+配置路径(快速见效)
首先得先把src里的模块导入改成符合Python包规范的写法:
打开src/a.py,把原来的from b import B改成下面二选一:
- 相对导入(适合同一包内的模块,更简洁):
from .b import B - 绝对导入(结构清晰,包复杂时更推荐):
from src.b import B
接下来解决测试时的路径问题,两种方式选一个就行:
方式A:临时设置环境变量
在终端运行测试前,先把项目根目录(就是包含src和test的那个文件夹)加到Python的搜索路径里:
# Linux/macOS 终端 export PYTHONPATH=. python test/unit.py # Windows CMD set PYTHONPATH=. python test/unit.py # Windows PowerShell $env:PYTHONPATH="." python test/unit.py
方式B:在测试文件里自动加路径
不想每次输环境变量的话,直接在test/unit.py最开头加这段代码,自动把根目录加到搜索路径:
import sys from pathlib import Path # 定位到项目根目录(test的上级文件夹) root_dir = Path(__file__).parent.parent sys.path.append(str(root_dir)) # 后面的代码不变 import unittest from src import a class TestUtils(unittest.TestCase): def test_function(self): self.assertEqual(a.func(), 1) if __name__ == '__main__': unittest.main()
方案2:用可编辑模式安装项目(长期维护首选)
如果这个项目要长期迭代,推荐把它做成可安装的Python包,一劳永逸解决导入问题:
- 在项目根目录创建一个
setup.py文件,内容如下:
from setuptools import setup, find_packages setup( name="my_project", version="0.1.0", packages=find_packages(where="src"), package_dir={"": "src"}, )
- 然后在终端执行这条命令,用pip安装可编辑模式:
pip install -e .
之后不管你在哪个目录,都能直接import src.a或者from src import b,运行程序和测试都不会再报导入错误了。
为啥原来会报错?
简单说:当你运行python test/unit.py时,Python只会把test目录加到它的模块搜索路径里,而你的src目录不在这个路径里。a.py里的from b import B是绝对导入,Python会在搜索路径里找b.py,自然找不到——毕竟b.py在src文件夹里。咱们上面的方案要么改导入方式让Python找对位置,要么把src所在的根目录加到搜索路径里,问题就解决了。
内容的提问来源于stack exchange,提问作者TrekMeisterGeneral
相关产品推荐
相关产品推荐

