Python模块导入报错:找不到src模块的原因及解决方法
问题原因
当你从外部模块执行from myproject.src import b时,Python将myproject.src识别为嵌套包,而b.py中使用的from src.a import some_class是绝对导入——此时src并非Python能直接定位的顶级包(除非myproject所在目录被加入Python的模块查找路径sys.path)。Python只会在当前工作目录、已安装库目录以及sys.path中的路径里寻找名为src的顶级包,自然找不到目标模块,因此抛出ModuleNotFoundError。
解决方法
以下是几种可行的解决方案,按需选择:
使用相对导入(推荐):
因为a.py和b.py在同一个src包下,直接在b.py中用相对路径导入:from .a import some_class这种方式不依赖外部路径配置,无论
src包处于哪个层级,都能正确定位同目录的模块。使用完整绝对导入路径:
如果偏好绝对导入,可写成从顶级包myproject开始的完整路径:from myproject.src.a import some_class前提是
myproject所在的目录已被加入Python的sys.path(比如你在myproject的父目录下运行代码,或手动添加路径)。将myproject父目录加入模块查找路径:
有两种实现方式:- 代码中手动添加:在导入
b之前执行import sys from pathlib import Path sys.path.append(str(Path(__file__).parent.parent)) # 假设当前文件在myproject父目录下 - 设置环境变量:以Linux/macOS为例,终端执行
之后再运行导入代码,export PYTHONPATH="/path/to/myproject/parent/directory:$PYTHONPATH"src会被识别为myproject的子包,b.py中的原有导入语句即可生效。
- 代码中手动添加:在导入
补充包标识文件:
在src目录下创建空的__init__.py文件,虽然Python 3.3+支持无该文件的命名空间包,但添加后能明确标识src是Python包,避免潜在的路径识别问题。
内容的提问来源于stack exchange,提问作者Anthraxff
相关产品推荐
相关产品推荐

