You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在子文件夹的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:48:23