如何在Jupyter Notebook中编写脚本实现多个笔记本按顺序自动运行
Jupyter 多笔记本顺序自动执行方案
完全可以通过单个控制笔记本实现批量按顺序执行其他Jupyter Notebook,常用的有两种成熟方案:
方案1:使用Jupyter原生内置工具实现(无需额外装包)
直接用Jupyter自带的nbconvert相关模块即可实现,适合不需要复杂参数配置的场景:
import os from nbconvert.preprocessors import ExecutePreprocessor import nbformat # 按照实际执行顺序填写所有笔记本的路径,路径为相对于当前控制笔记本的相对路径,也可写绝对路径 notebook_order = [ "./task1.ipynb", "./task2.ipynb", "./task3.ipynb", # 依次填写剩余的7个笔记本路径 "./task10.ipynb" ] # 配置执行参数,timeout设为None代表不限制单个笔记本的最大运行时长 execute_config = ExecutePreprocessor(timeout=None, kernel_name='python3') for nb_path in notebook_order: print(f"当前执行:{nb_path}") with open(nb_path, 'r', encoding='utf-8') as f: nb_content = nbformat.read(f, as_version=4) # 指定工作目录为被执行笔记本所在目录,避免笔记本内的相对路径读写报错 execute_config.preprocess(nb_content, {'metadata': {'path': os.path.dirname(nb_path)}}) # 可选:执行完成后保存带运行输出的新版本笔记本 with open(nb_path.replace('.ipynb', '_result.ipynb'), 'w', encoding='utf-8') as f: nbformat.write(nb_content, f) print(f"执行完成:{nb_path}\n")
特点:不需要额外安装依赖,开箱即用,如果需要中途某一个笔记本报错后继续执行后续任务,在外层加try-except捕获异常即可。
方案2:使用papermill工具实现(功能更丰富)
适合需要参数化运行、进度可视化、报错信息完整留存的场景,先执行pip install papermill完成安装,再运行以下代码:
import os import papermill as pm notebook_order = [ "./task1.ipynb", "./task2.ipynb", # 依次填写剩余的笔记本路径 "./task10.ipynb" ] # 提前创建保存执行结果的目录 os.makedirs('./run_result', exist_ok=True) for idx, nb_path in enumerate(notebook_order, start=1): output_path = f"./run_result/任务{idx}_{os.path.basename(nb_path)}" print(f"开始执行第{idx}个任务:{nb_path}") pm.execute_notebook( input_path=nb_path, output_path=output_path, kernel_name='python3', progress_bar=True, # 可选:给被执行的笔记本传入自定义参数,参数可在被执行笔记本的第一个标注为parameters的单元格中接收 parameters=None ) print(f"第{idx}个任务执行完成,结果已保存到:{output_path}\n")
特点:内置进度条展示执行进度,所有运行输出、报错信息都会完整保存在结果笔记本中,排查问题更方便,也支持给不同笔记本传入不同的自定义运行参数。
通用注意事项
- 如果被执行的笔记本需要用指定的虚拟环境运行,先把对应环境添加为Jupyter Kernel,再把代码中的
kernel_name改为对应kernel的名称即可 - 被执行的笔记本中不要保留需要手动交互输入的逻辑,否则执行流程会卡住
- 笔记本内的文件读写尽量用绝对路径,或者确认执行时的工作目录和手动运行时一致,避免路径报错
内容的提问来源于stack exchange,提问作者Nathes
相关产品推荐
相关产品推荐

