Notebook导入自定义project模块报ModuleNotFoundError求解
报错原因
Python执行模块导入时,会严格按照*sys.path*列表中存储的目录顺序查找目标包/模块。
你当前在my_folder目录下运行notebook时,Python默认会将notebook所在的my_folder目录、Jupyter启动时的工作目录加入搜索路径,但这两个路径都不包含project文件夹的上级父目录——而你的导入语句from project.utils import func是把project作为顶层包来引用的,Python在所有搜索路径里都找不到名为project的包文件夹,自然会抛出ModuleNotFoundError。
另外你当前的包结构本身是合法的:project目录下已经放置了__init__.py文件,不存在包结构不识别的问题。
修正方案
你可以根据自己的使用场景选以下任意一种方案:
- 临时修改搜索路径:在notebook的最开头添加代码,手动把
project文件夹所在的父目录加入Python搜索路径。示例代码如下,记得把路径替换成你本地的实际路径:
import sys # 填入project文件夹所在的上级目录的绝对路径 sys.path.append("/your/local/path/to/project-parent-dir") # 路径添加完成后再执行导入 from project.utils import func
如果不想写死绝对路径,也可以结合路径处理库自动计算位置,避免换设备时反复修改路径。
- 一劳永逸的可编辑安装:适合长期维护的项目。在
project文件夹的同级目录(也就是project的父目录下)新建pyproject.toml配置文件,写入基础配置:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "project" version = "0.0.1" packages = ["project"]
在该目录下打开终端,激活你当前使用的Python虚拟环境,执行命令pip install -e .将项目安装为可编辑包。安装完成后,不管你在哪个目录启动脚本、notebook,都可以直接导入project下的所有模块,不需要每次手动修改路径。
- 调整Jupyter启动位置:退出当前在
my_folder目录启动的Jupyter服务,切到project文件夹的上级父目录,重新执行jupyter notebook或者jupyter lab启动服务,再打开对应notebook运行即可。此时Jupyter默认将启动目录(即project的父目录)加入Python搜索路径,可以正常识别project包。
注意:不要为了省事直接在notebook里写
from utils import func这类跳过顶层包名的导入语句,这种写法强依赖运行时的工作目录,一旦切换文件运行位置就会再次触发导入错误,稳定性很差。
内容的提问来源于stack exchange,提问作者Azorx
相关产品推荐
相关产品推荐

