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

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的作用

在这个项目里它的核心作用有两个:

  1. 标记目录为Python包:没有__init__.py的目录不会被Python当作包,无法通过包名导入子模块。
  2. 控制批量导入范围:src/__init__.py里的__all__列表,决定了执行from src import *时,只会导入列表里的a、b、c三个子模块。

但它不会自动解决模块搜索路径问题,也不会调整子模块间的导入逻辑。

解决方法

选以下任意一种方式即可:

方式一:用相对导入(推荐)

修改src内部的导入为相对路径,明确引用同包内的模块:

  • src/a.py改为:
    from .b import B
    
  • src/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:57:12