如何在子文件夹的Jupyter Notebook中共享代码并管理外部数据?
Jupyter教程仓库的共享代码与数据管理优化方案
针对你遇到的父目录utils.py导入问题,以及大数据文件的管理需求,这里有几个实用的解决方案:
一、动态添加父目录到Python路径(最便捷)
在每个需要调用utils.py的Notebook开头添加一段简短代码,自动识别父目录并加入路径,无需手动硬编码:
import sys from pathlib import Path # 获取当前Notebook所在目录的父目录 parent_dir = Path.cwd().parent if str(parent_dir) not in sys.path: sys.path.append(str(parent_dir)) # 现在可以直接导入utils模块 from utils import download_data
这种方式适配所有子文件夹的Notebook,代码量少,对其他用户友好,不需要额外配置。
二、将父目录转为可导入包(更规范)
在仓库根目录下创建一个空的__init__.py文件,让Python将根目录视为一个包。之后Notebook里可以用绝对导入:
# 假设仓库根目录名为jupyter-tutorials from jupyter-tutorials.utils import download_data
配合前面的动态路径添加,或者让用户把仓库根目录加入PYTHONPATH,就能实现无额外代码导入。
三、设置全局PYTHONPATH环境变量
让用户克隆仓库后,执行一次环境变量配置,将仓库根目录加入PYTHONPATH:
- Linux/macOS终端:
export PYTHONPATH=/path/to/your/repo/root:$PYTHONPATH - Windows命令行:
set PYTHONPATH=C:\path\to\your\repo\root;%PYTHONPATH%
可以把这段命令写在README.md里,用户执行后所有Notebook都能直接导入utils,无需修改Notebook代码。
四、优化数据下载的缓存机制
针对大文件下载,建议在utils.py里添加缓存逻辑,避免重复下载:
from pathlib import Path import requests def download_data(url, save_dir="data"): save_dir = Path(save_dir) save_dir.mkdir(exist_ok=True) file_name = url.split("/")[-1] save_path = save_dir / file_name if save_path.exists(): print(f"本地已存在数据文件,直接使用: {save_path}") return save_path # 流式下载大文件 with requests.get(url, stream=True) as r: r.raise_for_status() with open(save_path, "wb") as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) print(f"数据文件下载完成: {save_path}") return save_path
同时在仓库根目录创建.gitignore文件,添加data/规则,确保数据文件不会被提交到GitHub。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

