Enforce the run order of Jupyter notebooks.
Jupyter notebooks are great for interactive data analysis. However, they can encourage a bad habit: running cells out of order. This can lead to notebooks being committed to the repository in a state where they don't run from top to bottom, and other collaborators may receive different results when trying to reproduce the analysis.
enforce-notebook-run-order attempts to fix this by raising an
exception before each commit if any cells are run out of order.
This tool works with all Jupyter notebook kernels, including:
- Python (IPython)
- R (IRkernel)
- Julia
- Scala, Java, C++, and many others
Any language kernel that produces standard .ipynb files with
execution_count metadata is supported. The tool is language-agnostic
and only inspects the notebook's execution order metadata.
For a notebook to be considered valid, it must meet the following requirements:
- All non-empty code cells must be executed: Each code cell with
content must have an
execution_countvalue (notNone). - Execution must start from 1: The first non-empty code cell must
have
execution_count=1. - No gaps in execution sequence: Execution counts must be strictly sequential (1, 2, 3, ...) with no skipped numbers.
Examples:
- ✅ Valid: Cells with execution counts
1, 2, 3, 4 - ❌ Invalid: Cells starting with
0, 1, 2(must start from 1) - ❌ Invalid: Cells starting with
2, 3, 4(must start from 1) - ❌ Invalid: Cells with
1, 2, 4, 5(gap at 3) - ❌ Invalid: Cells with
1, 3, 2(not sequential) - ❌ Invalid: Cells with
1, 2, None(unexecuted cell)
Note: Empty code cells (cells with no content) are ignored and do not need to be executed.
enforce-notebook-run-order is designed to work primarily as a
pre-commit hook, but can also be used as a
standalone script when needed.
The intended way to use enforce-notebook-run-order is as a pre-commit
hook to automatically validate notebook execution order before each
commit.
To set it up, add the following to your .pre-commit-config.yaml:
repos:
- repo: https://github.com/cmhac/enforce-notebook-run-order
rev: <replace with latest version from https://github.com/cmhac/enforce-notebook-run-order/releases/>
hooks:
- id: enforce-notebook-run-orderThis will automatically check all notebooks in your repository before each commit, preventing out-of-order execution from being committed to your repository.
For manual validation or CI integration, enforce-notebook-run-order
can be used as a standalone script.
First, install it the same way you install other Python packages, such as:
pip install enforce-notebook-run-orderRun it with the path to the notebook(s) you want to check:
nbcheck my_notebook.ipynb my_other_notebook.ipynbOr point it to a directory to check all notebooks in that directory:
nbcheck my_notebooks/If no paths are specified, nbcheck will check all notebooks in the
current directory.
You can also use the full enforce-notebook-run-order command, but the
nbcheck command is provided as a convenience.