如何将.ipynb与.py文件归类到子文件夹并实现跨目录导入?
现有环境变量+切换目录方法的弊端
- 路径依赖与配置繁琐:必须确保环境变量
MY_PROJECT_PATH已正确设置,换环境(本地、服务器、协作伙伴的机器)时都要重复配置,一旦路径写错或环境变量未设置,所有导入都会直接失败。 - 工作目录混乱:
os.chdir()会改变整个笔记本的全局工作目录,后续如果用相对路径读写笔记本所在目录的文件(比如notebooks/sub/analysis_data.csv),会被解析为相对于project根目录的路径,导致文件找不到或误写入其他位置。 - 代码冗余与维护成本高:每个笔记本都要复制粘贴这段路径处理代码,后续如果项目目录结构调整,需要逐个修改所有笔记本的代码,非常麻烦。
- IDE功能失效:VS Code、PyCharm等IDE的代码提示、模块跳转功能依赖当前工作目录和Python路径,切换目录后可能无法正确识别
src下的模块,影响开发效率。
更优实现方案
方案1:动态添加项目根目录到Python路径
无需切换工作目录,直接将project根目录加入Python的模块搜索路径,既不影响文件读写的相对路径,又能正常导入src模块。示例代码:
import sys from pathlib import Path # 从当前笔记本路径向上回溯到project根目录(假设笔记本在notebooks文件夹下) project_root = Path.cwd().parent # 如果笔记本在notebooks的子文件夹里,就多写一个.parent:Path.cwd().parent.parent sys.path.append(str(project_root)) # 现在可以正常导入 from src.dummy import *
可以把这段获取根目录的逻辑封装成notebooks/utils.py里的函数,其他笔记本直接导入调用,减少代码冗余。
方案2:将项目设为可安装包(推荐)
把项目按照Python标准包结构配置,用开发模式安装后,无论笔记本在哪个位置,都能直接导入src模块,这是最规范的长期解决方案。
- 在project根目录创建
pyproject.toml文件:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "my_project" version = "0.1.0" packages = ["src"]
- 在project根目录执行开发安装命令:
pip install -e .
之后所有笔记本里无需任何路径处理代码,直接写from src.dummy import *即可,IDE的代码提示、跳转功能也能完美工作。
方案3:配置Jupyter默认工作目录
如果只用Jupyter Notebook/Lab做开发,可以修改Jupyter配置,把默认工作目录设为project根目录,启动Jupyter后直接在根目录下操作,无需处理路径:
- 生成Jupyter配置文件:
jupyter notebook --generate-config
- 打开生成的配置文件(一般路径为
~/.jupyter/jupyter_notebook_config.py),找到c.NotebookApp.notebook_dir,取消注释并设置为project的绝对路径:
c.NotebookApp.notebook_dir = "/绝对路径/到/你的/project"
- 重启Jupyter后,默认就会进入project根目录,笔记本可以直接导入
src和访问data文件夹。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

