我已经使用的一种直接方法是使用nbconvert 执行整个笔记本。
由于--execute 选项告诉nbconvert 在转换之前执行笔记本,笔记本failed.ipynb 引发异常将导致运行失败。
jupyter nbconvert --to notebook --execute failed.ipynb
# ...
# Exception: FAILED
echo $?
# 1
另一个正确的笔记本passed.ipynb 将导致成功导出。
jupyter nbconvert --to notebook --execute passed.ipynb
# [NbConvertApp] Converting notebook passed.ipynb to notebook
# [NbConvertApp] Writing 1172 bytes to passed.nbconvert.ipynb
echo $?
# 0
锦上添花,您也可以这样做through the API,然后将其包装在 Pytest 中!
import nbformat
import pytest
from nbconvert.preprocessors import ExecutePreprocessor
@pytest.mark.parametrize("notebook", ["passed.ipynb", "failed.ipynb"])
def test_notebook_exec(notebook):
with open(notebook) as f:
nb = nbformat.read(f, as_version=4)
ep = ExecutePreprocessor(timeout=600, kernel_name='python3')
try:
assert ep.preprocess(nb) is not None, f"Got empty notebook for {notebook}"
except Exception:
assert False, f"Failed executing {notebook}"
运行测试给出。
pytest test_nbconv.py
# FAILED test_nbconv.py::test_notebook_exec[failed.ipynb] - AssertionError: Failed executing failed.ipynb
# PASSED test_nbconv.py::test_notebook_exec[passed.ipynb]
注意事项
这不会将笔记本本身转换为其他格式,而是允许在笔记本上运行 nbconvert 预处理器,和/或转换为其他笔记本格式。
- python 代码示例只是一个草稿,它可以大大改进。