如何通过nbconvert CLI执行ipynb至首个错误并保存结果文件?
问题:通过CLI实现Jupyter Notebook遇首个错误即停止并保存执行结果?
我希望通过CLI运行ipynb文件,满足以下要求:
- 遇到第一个错误时立即停止执行
- 保存生成的文件,该文件需包含出错前所有单元格的输出以及错误信息
但现有的jupyter nbconvert --execute [myfile.ipynb]无法满足需求:出错时不会生成任何文件;添加--allow-errors参数也不行,因为它会继续执行后续单元格,不会在首个错误后停止。
官方文档提供了代码实现逻辑:
笔记本执行过程中出现错误时,默认会停止执行并抛出CellExecutionError,同时会打印导致错误的源单元格及原始错误名称和信息。出错后仍可按如下方式保存笔记本:
with open('executed_notebook.ipynb', mode='w', encoding='utf-8') as f: nbformat.write(nb, f)
请问是否可以通过CLI实现该功能?
解决方案
原生jupyter nbconvert没有直接的CLI参数能同时满足「遇首个错误停止」+「保存执行结果(含错误)」的需求,但可以通过编写自定义脚本并封装为CLI工具的方式实现:
1. 编写自定义Python脚本
创建一个名为run_nb_until_error.py的脚本,内容如下:
#!/usr/bin/env python3 import argparse import nbformat from nbconvert.preprocessors import ExecutePreprocessor, CellExecutionError def run_notebook(input_path, output_path): # 读取目标笔记本文件 with open(input_path, 'r', encoding='utf-8') as f: nb = nbformat.read(f, as_version=4) # 配置执行器:超时时间300秒,使用Python3内核 ep = ExecutePreprocessor(timeout=300, kernel_name='python3') try: ep.preprocess(nb, {'metadata': {'path': '.'}}) except CellExecutionError: # 捕获到第一个错误时停止执行,不抛出异常 pass finally: # 无论是否出错,都保存执行后的笔记本(含之前的输出和错误信息) with open(output_path, 'w', encoding='utf-8') as f: nbformat.write(nb, f) if __name__ == '__main__': parser = argparse.ArgumentParser(description='Run Jupyter notebook until first error and save the result.') parser.add_argument('input', help='Path to your input .ipynb file') parser.add_argument('-o', '--output', default='executed_notebook.ipynb', help='Path to save the executed notebook (default: executed_notebook.ipynb)') args = parser.parse_args() run_notebook(args.input, args.output)
2. 作为CLI工具运行
在Unix/Linux/macOS系统中,赋予脚本执行权限:
chmod +x run_nb_until_error.py之后直接通过CLI调用:
./run_notebook_until_error.py your_notebook.ipynb -o result.ipynb在Windows系统中,直接通过Python调用:
python run_notebook_until_error.py your_notebook.ipynb -o result.ipynb
该脚本会在遇到第一个错误时立即停止执行,并将包含出错前所有输出及错误信息的笔记本保存到指定路径。
内容的提问来源于stack exchange,提问作者tba
相关产品推荐
相关产品推荐

