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

如何在Jupyter中加载其他Notebook的单元格至当前笔记本?

实现Jupyter Notebook模板单元格加载的方法

默认Jupyter没有内置的%load_nb这类直接加载整个Notebook单元格到当前笔记本的魔法命令,但可以通过以下两种方式实现需求:

一、自定义IPython魔法命令

你可以自己编写一个魔法命令,读取目标Notebook的JSON结构,再调用Jupyter前端API将单元格插入当前笔记本。

具体代码实现

在当前笔记本中运行以下代码,即可注册%load_nb魔法命令:

import nbformat
from IPython.core.magic import register_line_magic
from IPython.display import display, Javascript

@register_line_magic
def load_nb(line):
    # 获取输入的模板文件路径
    nb_path = line.strip()
    # 读取目标Notebook文件(采用IPython Notebook v4版本格式)
    nb = nbformat.read(nb_path, as_version=4)
    
    # 生成插入单元格的JavaScript代码
    js_commands = []
    for cell in nb.cells:
        cell_type = cell.cell_type
        # 转义源代码中的换行和单引号,避免JS语法错误
        escaped_source = cell.source.replace('\n', '\\n').replace("'", "\\'")
        
        if cell_type == 'code':
            cmd = f"""
            var cell = Jupyter.notebook.insert_cell_at_bottom('code');
            cell.set_text('{escaped_source}');
            """
        elif cell_type == 'markdown':
            cmd = f"""
            var cell = Jupyter.notebook.insert_cell_at_bottom('markdown');
            cell.set_text('{escaped_source}');
            """
        js_commands.append(cmd)
    
    # 执行JS命令,插入所有单元格
    display(Javascript(''.join(js_commands)))

# 解除魔法命令名称与函数名的绑定(可选,避免函数名冲突)
del load_nb

使用方式

运行上述代码后,直接在单元格中输入:

%load_nb template.ipynb

执行后,template.ipynb中的所有单元格会被插入到当前笔记本的底部,你可以直接编辑或执行这些单元格。

二、封装成Python包函数

如果需要做成类似my_package.load_template('opencv')的调用形式,可以将逻辑封装到你的Python包中:

包内函数实现

在你的包目录下创建一个模块(比如template_loader.py),写入以下代码:

import nbformat
import os
from IPython.display import display, Javascript

def load_template(template_name):
    # 假设模板文件存放在包的templates子目录下
    template_dir = os.path.join(os.path.dirname(__file__), 'templates')
    template_path = os.path.join(template_dir, f'{template_name}.ipynb')
    
    # 读取模板Notebook
    nb = nbformat.read(template_path, as_version=4)
    
    # 生成插入单元格的JS代码
    js_commands = []
    for cell in nb.cells:
        cell_type = cell.cell_type
        escaped_source = cell.source.replace('\n', '\\n').replace("'", "\\'")
        
        if cell_type == 'code':
            cmd = f"""
            var cell = Jupyter.notebook.insert_cell_at_bottom('code');
            cell.set_text('{escaped_source}');
            """
        elif cell_type == 'markdown':
            cmd = f"""
            var cell = Jupyter.notebook.insert_cell_at_bottom('markdown');
            cell.set_text('{escaped_source}');
            """
        js_commands.append(cmd)
    
    display(Javascript(''.join(js_commands)))

目录结构示例

你的包结构应该类似:

my_package/
├── __init__.py
├── template_loader.py
└── templates/
    ├── opencv.ipynb
    └── other_template.ipynb

用户使用方式

用户安装你的包后,在笔记本中执行:

from my_package.template_loader import load_template
load_template('opencv')

就能将预设的OpenCV模板单元格插入当前笔记本。

注意事项

  • 上述方法依赖Jupyter经典版的前端API,JupyterLab的API不同,若要支持Lab需要调整JS代码逻辑。
  • 如果模板单元格包含元数据(如标签、折叠状态),可以在JS代码中额外设置cell.metadata来保留这些信息,需要注意元数据的JSON转义处理。

内容的提问来源于stack exchange,提问作者link89

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:22:02