JupyterLab环境下Python包与模块导入报ModuleNotFoundError问题求助
问题产生原因
该问题由Python模块搜索路径规则和导入写法不匹配导致,具体逻辑如下:
post.py中的from pre import xyz属于隐式相对导入,仅当运行环境的工作目录为sub/文件夹时可正常执行:此时Python搜索路径sys.path会自动加入当前工作目录,可直接定位到同目录下的pre.py。- 从
top_main.ipynb执行导入时,运行环境的工作目录为top/文件夹,sys.path默认包含top/路径、无sub/路径。加载sub.post模块时,post.py中的from pre import xyz会被识别为绝对导入,Python仅会在sys.path包含的路径下搜索pre模块,匹配不到就抛出ModuleNotFoundError。
解决方案
可根据使用场景选择以下任意一种方案:
方案1:修改为显式相对导入(适合包内模块统一调用场景)
将post.py中的导入语句修改为:
from .pre import xyz
前缀.表示从当前包所在路径搜索模块,从top_main.ipynb导入时可正常匹配。
注意:该修改后不能直接在sub/sub_main.ipynb中单独导入post模块,因为单独导入时post会被识别为顶层模块,不支持相对导入规则,如有该需求请选择方案2。
方案2:修改为基于顶层包的绝对导入(适配全场景调用)
将post.py中的导入语句修改为:
from sub.pre import xyz
该写法只要top/路径在sys.path中就可正常执行,兼容从top_main.ipynb和sub_main.ipynb两个位置调用。如果sub_main.ipynb运行时出现报错,在该notebook开头加入以下代码将top/路径加入搜索路径即可:
import sys import os sys.path.append(os.path.abspath('..'))
方案3:临时调整搜索路径(无需修改源代码的临时方案)
如果不想修改post.py的原有代码,可在top_main.ipynb的导入语句前加入以下代码,将sub/路径临时加入搜索路径:
import sys import os sys.path.append(os.path.abspath('./sub'))
之后再执行导入操作即可正常运行。
内容的提问来源于stack exchange,提问作者CarloP
相关产品推荐
相关产品推荐

