Python从嵌套子目录导入函数报ModuleNotFoundError问题排查
问题根因
你的操作存在两个核心错误:
- 首次导入报错是Python模块搜索的默认机制导致的:运行
notebook.ipynb时,Python的sys.path默认只包含当前notebook的工作目录(一般是notebooks/文件夹)、Python安装目录等路径,这些路径下不存在名为app的Python包,自然会触发ModuleNotFoundError: No module named 'app'。 - 追加路径后仍然报错是路径填写错误+路径层级理解错误:
- 你写的
/app是系统根目录下的绝对路径,指向磁盘最顶层的app文件夹,和你本地存放项目的外层app目录完全不是一个位置,Python当然找不到对应模块; - 就算路径写对,你也需要明确:你项目里带
__init__.py的内层app文件夹才是真正的Python包,导入时需要把这个包的父目录(也就是最外层的项目app文件夹)加到sys.path里,而不是把包本身的路径加进去。
- 你写的
正确修复方式
在notebook的最开头单元格执行以下代码,自动追加正确的搜索路径,不需要手动写死绝对路径:
import sys from pathlib import Path # 当前notebook在notebooks目录下,往上一级就是外层项目app目录,也就是内层app包的父目录 project_root = Path.cwd().parent.resolve() if str(project_root) not in sys.path: sys.path.append(str(project_root))
执行完上述代码后,再运行from app.file import func_name即可正常导入。
补充说明:如果你的jupyter启动时的工作目录不是
notebooks文件夹,就把Path.cwd().parent.resolve()替换成你本地最外层项目app文件夹的实际绝对路径,比如Windows下存放在D:/code/app就写Path("D:/code/app").resolve(),Mac/Linux下存放在~/code/app就写Path.home()/"code/app"。
内容的提问来源于stack exchange,提问作者NineWasps
相关产品推荐
相关产品推荐

