无需打包模块,如何在Jupyter Notebook中导入同级模块下子文件夹的Python文件
报错原因
你在命令行执行python api.py时,Python会自动将api.py所在的some_module目录加入模块搜索路径sys.path,因此submodule.py里的from helpers import helper_fun可以正常找到对应模块。
而运行notebook时,默认工作目录是notebook.ipynb所在的根目录(some_module的上级目录),sys.path默认没有包含some_module目录,因此submodule.py导入helpers时会找不到对应模块。
解决方案(无需打包模块)
方案1:不改动原有业务代码,仅在notebook中添加路径配置(推荐)
在执行导入语句前,先将some_module的绝对路径加入sys.path,代码如下:
import sys import os # 由于notebook和some_module同级,直接拼接相对路径即可获取到some_module的绝对路径 sys.path.append(os.path.abspath("./some_module"))
执行完上述代码后,再运行from some_module.subfolder import submodule即可正常导入。
方案2:修改submodule.py的导入语句为相对导入
将submodule.py中的from helpers import helper_fun改为相对导入写法:
from ..helpers import helper_fun
该写法表示从当前文件的上级目录导入helpers模块,只要按照包结构导入就能正常匹配依赖。
注意:采用该方案后,若你仍需要在命令行运行
api.py,不能再直接使用python api.py命令,需要切换到some_module的上级目录,执行python -m some_module.api运行,否则会因为相对导入规则报错。
内容的提问来源于stack exchange,提问作者Jivan
相关产品推荐
相关产品推荐

