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

运行Python测试时出现ModuleNotFoundError问题求助

问题分析

直接运行src/main.py时,Python会自动将src目录加入sys.path(模块搜索路径),所以from sub.dummyB import Sub能正常找到子模块。但执行测试时,你是从项目根目录启动测试工具,此时sys.path中没有src目录,dummyA.py里的绝对导入语句就无法定位到sub模块——因为sub是src下的子模块,而非全局可见模块。

解决方案

以下三种方法可解决该问题,按需选择:

方法1:改用相对导入(规范项目结构推荐)

修改src目录内的导入语句为相对导入,让模块引用基于当前包结构:

  • src/dummyA.py:
    from .sub.dummyB import Sub  # .表示当前目录的子模块
    class Sup:
        def __init__(self):
            self.sub_var = Sub()
    
        def hello_sup(self, s):
            sub_word = self.sub_var.hello_sub(s)
            return f"Super {sub_word}!"
    
  • src/main.py:
    from .sub.dummyB import Sub
    from .dummyA import Sup
    
    def main():
        sub = Sub()
        sup = Sup()
    
        dummy_text = "cat"
    
        sub_word = sub.hello_sub(dummy_text)
        sup_word = sup.hello_sup(dummy_text)
    
        print("Sub is:", sub_word) # cat
        print(f"Sup is: {sup_word}") # Super cat!
    
    if __name__ == "__main__":
        main()
    

之后从项目根目录用模块方式启动主程序:

python -m src.main

测试代码无需修改,from src.dummyA import Sup能正确解析,且dummyA内的相对导入也可正常工作。

方法2:在测试文件中手动添加src到搜索路径

直接修改测试文件,将src目录加入sys.path:

  • tests/test_s.py:
    import sys
    from pathlib import Path
    
    # 把项目根目录下的src文件夹添加到模块搜索路径
    sys.path.append(str(Path(__file__).parent.parent / "src"))
    
    from dummyA import Sup
    
    def test_sub_sup():
        dummy_sup = Sup()
        expected_res = dummy_sup.hello_sup("cat")
        assert expected_res == "Super cat!"
    

这种方法无需改动原项目代码,适合快速调试,但长期维护建议采用更规范的方法1或3。

方法3:将项目安装为可编辑模式(适合全局导入场景)

从项目根目录执行以下命令,将src作为可编辑包安装到Python环境:

pip install -e .

该命令会在Python的site-packages中创建指向项目src目录的链接,之后无论在哪个目录,都能直接导入src下的模块,测试代码和主程序的导入语句无需修改。

验证

完成上述任一方法后,从项目根目录执行测试命令:

pytest tests/test_s.py
# 或
python -m unittest tests/test_s.py

此时测试应能正常运行,不会再出现ModuleNotFoundError。

内容的提问来源于stack exchange,提问作者user840718

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:07:44