Python模块导入兼容问题:单元测试与包环境无法同时正常工作
Python包导入与单元测试兼容解决方案
核心方案:统一绝对导入 + 可编辑模式安装项目
1. 统一包内导入格式
所有包内文件(如src/example/main.py)使用不带src前缀的绝对导入,完全遵循用户安装后的导入逻辑。例如:
# src/example/main.py from example.dir.internal import some_function
这样pip安装包后,example作为顶层包直接存在于site-packages中,不会出现ModuleNotFoundError。
2. 调整单元测试运行方式
先将项目以可编辑模式安装到测试环境,让测试代码能像外部用户一样识别example包:
- 执行命令(在项目根目录,即包含
setup.cfg的目录):pip install -e . - 之后正常运行测试:
python -m unittest discover test
测试文件(如test/test_main.py)同样使用无src前缀的绝对导入:
# test/test_main.py import unittest from example.main import main class TestMain(unittest.TestCase): def test_main(self): # 测试逻辑 pass
方案原理
可编辑模式(-e参数)会将src目录下的包链接到Python的site-packages,使example成为全局可识别的顶层包。不管是包内代码还是测试代码,都使用完全一致的绝对导入路径,从根源上解决了两种场景的导入冲突,既符合Python包规范,又无需依赖相对导入或修改sys.path。
内容的提问来源于stack exchange,提问作者wangf22
相关产品推荐
相关产品推荐

