Python Notebook导入包内嵌套模块报No module named 'B'如何解决
报错根因
先明确对应目录结构:
Package_P/ ├── __init__.py ├── A.py # 内部导入语句为 import B └── B.py Notebook_folder/ └── X.ipynb # 内部尝试执行 import A
报错由两层不符合Python3导入规则的写法共同导致:
- Python导入模块时会严格按照
sys.path存储的目录列表做顶层搜索,当前Notebook启动后,sys.path默认仅包含Notebook所在的Notebook_folder目录、Python环境内置依赖目录,既没有识别到Package_P是一个合法包,也无法直接定位到顶层的A模块。 A.py中写的import B属于Python2时代的隐式相对导入语法,Python3已完全移除该逻辑:包内的模块如果要引用同包下的其他模块,必须显式写相对导入或者全路径绝对导入,否则解释器只会去顶层搜索路径下找名为B的独立模块,而B实际属于Package_P的内部模块,不在顶层搜索范围内,直接触发ModuleNotFoundError。
修复方案
按以下两步调整即可解决问题:
- 第一步:修改
A.py内的导入语句,两种合法写法二选一:- 显式相对导入(包内引用推荐写法):将
import B替换为from . import B,其中.指代当前A.py所属的Package_P包目录,解释器会直接在同包范围内查找B模块 - 全路径绝对导入:将
import B替换为from Package_P import B,该写法要求Package_P本身处于Python的搜索路径中才可生效
- 显式相对导入(包内引用推荐写法):将
- 第二步:调整Notebook侧的导入逻辑,保证解释器可识别
Package_P包,两种常用方案按需选择:- 临时路径配置(适合单次Notebook调试场景):在Notebook最开头添加代码,将
Package_P的父目录加入搜索路径,之后按包结构导入A即可:import sys # 替换为你本地Package_P所在的父目录实际路径 sys.path.append("/local/path/to/parent/of/Package_P") from Package_P import A - 规范目录/环境配置(长期使用推荐):要么将X.ipynb移动到和
Package_P同级的目录下启动,要么将Package_P以开发模式安装到当前Notebook使用的Python环境中,后续无需额外修改路径,直接按包结构导入即可正常运行。
- 临时路径配置(适合单次Notebook调试场景):在Notebook最开头添加代码,将
注意:不要直接将
Package_P目录本身加入sys.path,否则会破坏包的层级结构,把A、B识别为顶层模块,后续仍会触发导入异常。
内容的提问来源于stack exchange,提问作者Jean-Élisée Yao
相关产品推荐
相关产品推荐

