Unittest模块导入问题:无法找到导入模块中的依赖模块
项目目录结构
project/ __init__.py (空文件) tests/ __init__.py (空文件) tests.py src/ __init__.py a.py b.py c.py
各文件内容
tests/tests.py
import unittest from a import A my_a = A() class TestClass(unittest.TestCase): # 测试用例 pass
src/init.py
__all__ = ["a", "b", "c"]
src/a.py
from b import B
src/b.py
from c import C
src/c.py
pass
问题描述
命令行运行代码一切正常,但执行测试时抛出错误:ModuleNotFoundError: No module named 'b'。困惑该场景下__init__.py的作用,以及测试无法识别导入路径的原因,需要解决。
问题原因
执行测试时,Python的模块搜索路径(sys.path)基于当前运行目录:
- 若直接在
tests/目录下运行tests.py,Python只会在tests/和系统默认路径查找模块,找不到src/下的文件。 - 即使在
project/目录运行测试,src/也不会自动加入搜索路径,且src/a.py里的from b import B是把b当作顶级模块导入,而非src包的子模块,自然找不到。
init.py的作用
在这个项目里它的核心作用有两个:
- 标记目录为Python包:没有
__init__.py的目录不会被Python当作包,无法通过包名导入子模块。 - 控制批量导入范围:
src/__init__.py里的__all__列表,决定了执行from src import *时,只会导入列表里的a、b、c三个子模块。
但它不会自动解决模块搜索路径问题,也不会调整子模块间的导入逻辑。
解决方法
选以下任意一种方式即可:
方式一:用相对导入(推荐)
修改src内部的导入为相对路径,明确引用同包内的模块:
src/a.py改为:from .b import Bsrc/b.py改为:from .c import C
然后修改tests/tests.py的导入路径,从src包导入:
import unittest from src.a import A my_a = A() class TestClass(unittest.TestCase): # 测试用例 pass
最后在project/目录下运行测试:
python -m unittest tests.tests
方式二:手动添加搜索路径
在tests/tests.py开头添加代码,把src目录加入Python的搜索路径:
import unittest import sys import os # 拼接src目录的绝对路径并加入搜索路径 sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'src')) from a import A my_a = A() class TestClass(unittest.TestCase): # 测试用例 pass
这样在project/或tests/目录下运行测试都能正常执行。
内容的提问来源于stack exchange,提问作者wavesinaroom
相关产品推荐
相关产品推荐

