如何程序化运行Jupyter Notebook并注入宿主变量以生成报告?
程序化注入变量到Jupyter Notebook执行上下文的方案
完全可以通过nbconvert的ExecutePreprocessor实现将宿主Python解释器的变量注入Notebook的执行上下文,以下是具体实现步骤和代码示例:
核心思路
ExecutePreprocessor在执行Notebook时,可通过自定义执行命名空间的方式,将宿主环境中的变量直接传入Notebook的全局作用域,无需修改模板Notebook的代码结构。
步骤1:准备环境与依赖
确保已安装所需包:
pip install nbconvert nbformat
步骤2:编写模板Notebook
在模板中直接使用待注入的变量名即可,无需额外语法。例如模板report_template.ipynb的代码单元格可以写:
# 直接使用宿主注入的report_data变量 print(f"报告标题: {report_data['title']}") print(f"生成日期: {report_data['date']}") import matplotlib.pyplot as plt months = list(report_data['sales'].keys()) values = list(report_data['sales'].values()) plt.bar(months, values) plt.title(report_data['title']) plt.ylabel("销售额") plt.show()
步骤3:宿主代码实现变量注入与Notebook执行
import nbformat from nbconvert.preprocessors import ExecutePreprocessor from nbconvert import HTMLExporter # 1. 宿主环境中定义的报告数据 report_data = { "title": "2024年Q1销售报告", "sales": {"1月": 12000, "2月": 15000, "3月": 18000}, "date": "2024-04-01" } # 2. 加载模板Notebook文件 with open("report_template.ipynb", "r", encoding="utf-8") as f: nb = nbformat.read(f, as_version=4) # 3. 配置执行处理器,传入自定义命名空间 # timeout:执行超时时间(秒),kernel_name:指定使用的Python内核 ep = ExecutePreprocessor(timeout=600, kernel_name="python3") # 关键操作:将宿主变量传入Notebook的执行命名空间 execution_context = {"report_data": report_data} ep.preprocess(nb, {"metadata": {"path": "./"}, "namespace": execution_context}) # 4. 保存执行后的Notebook(可选) with open("executed_report.ipynb", "w", encoding="utf-8") as f: nbformat.write(nb, f) # 5. 转换为静态HTML报告 html_exporter = HTMLExporter() html_exporter.exclude_input = True # 可选:隐藏代码单元格,只保留输出内容 html_body, resources = html_exporter.from_notebook_node(nb) with open("sales_report.html", "w", encoding="utf-8") as f: f.write(html_body)
注意事项
- 确保内核名称
kernel_name与宿主环境的Python内核一致(通常为python3或python) - 如果模板Notebook依赖第三方库(如
matplotlib),需提前在宿主环境安装 - 若需要注入多个变量,直接在
execution_context字典中添加键值对即可 - 超时时间
timeout可根据Notebook的计算复杂度调整,避免执行中断
内容的提问来源于stack exchange,提问作者Mikko Ohtamaa
相关产品推荐
相关产品推荐

