From d09a23efafdd19df5348171b8a2a65564f5f05c1 Mon Sep 17 00:00:00 2001 From: Nguyen Huy Hoang <24520554@gm.uit.edu.vn> Date: Thu, 26 Mar 2026 21:42:06 +0700 Subject: [PATCH 1/4] refactor: make `kernel_name` override update notebook `kernelspec` metadata Signed-off-by: Nguyen Huy Hoang <181364121+huyhoang171106@users.noreply.github.com> --- papermill/execute.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/papermill/execute.py b/papermill/execute.py index eb76cc34..666d1961 100644 --- a/papermill/execute.py +++ b/papermill/execute.py @@ -11,6 +11,17 @@ from .utils import chdir +def _override_kernel_name_in_metadata(nb, kernel_name): + if not kernel_name: + return nb + + kernelspec = nb.metadata.get('kernelspec', {}) + kernelspec['name'] = kernel_name + kernelspec['display_name'] = kernel_name + nb.metadata['kernelspec'] = kernelspec + return nb + + def execute_notebook( input_path, output_path, @@ -104,7 +115,7 @@ def execute_notebook( engine_name=engine_name, ) - nb = prepare_notebook_metadata(nb, input_path, output_path, report_mode) + nb = prepare_notebook_metadata(nb, input_path, output_path, report_mode, kernel_name=kernel_name) # clear out any existing error markers from previous papermill runs nb = remove_error_markers(nb) @@ -136,7 +147,7 @@ def execute_notebook( return nb -def prepare_notebook_metadata(nb, input_path, output_path, report_mode=False): +def prepare_notebook_metadata(nb, input_path, output_path, report_mode=False, kernel_name=None): """Prepare metadata associated with a notebook and its cells Parameters @@ -149,6 +160,8 @@ def prepare_notebook_metadata(nb, input_path, output_path, report_mode=False): Path to write executed notebook report_mode : bool, optional Flag to set report mode + kernel_name : str, optional + Name of kernel to persist in notebook metadata """ # Hide input if report-mode is set to True. if report_mode: @@ -157,6 +170,8 @@ def prepare_notebook_metadata(nb, input_path, output_path, report_mode=False): cell.metadata['jupyter'] = cell.get('jupyter', {}) cell.metadata['jupyter']['source_hidden'] = True + nb = _override_kernel_name_in_metadata(nb, kernel_name) + # Record specified environment variable values. nb.metadata.papermill['input_path'] = input_path nb.metadata.papermill['output_path'] = output_path From f61f4600b937e4adc43ff7adc5c71c2b65722e90 Mon Sep 17 00:00:00 2001 From: Nguyen Huy Hoang <24520554@gm.uit.edu.vn> Date: Thu, 26 Mar 2026 21:42:08 +0700 Subject: [PATCH 2/4] refactor: make `kernel_name` override update notebook `kernelspec` metadata Signed-off-by: Nguyen Huy Hoang <181364121+huyhoang171106@users.noreply.github.com> --- papermill/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/papermill/cli.py b/papermill/cli.py index 0c1b54d0..1c563c1b 100755 --- a/papermill/cli.py +++ b/papermill/cli.py @@ -86,7 +86,7 @@ def print_papermill_version(ctx, param, value): @click.option( '--kernel', '-k', - help='Name of kernel to run. Ignores kernel name in the notebook document metadata.', + help='Name of kernel to run. Overrides kernel name in the notebook document metadata.', ) @click.option( '--language', From e660f6548a4a4e74427c520513e25c327db81cab Mon Sep 17 00:00:00 2001 From: Nguyen Huy Hoang <24520554@gm.uit.edu.vn> Date: Thu, 26 Mar 2026 21:42:10 +0700 Subject: [PATCH 3/4] refactor: make `kernel_name` override update notebook `kernelspec` metadata Signed-off-by: Nguyen Huy Hoang <181364121+huyhoang171106@users.noreply.github.com> --- papermill/tests/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/papermill/tests/__init__.py b/papermill/tests/__init__.py index fdd395ed..96f8d68d 100644 --- a/papermill/tests/__init__.py +++ b/papermill/tests/__init__.py @@ -1,6 +1,7 @@ import os kernel_name = 'python3' +override_kernel_name = 'papermill-kernel-override' def get_notebook_path(*args): From da1520bacadb90ad24a2bb2d93665a5899b59430 Mon Sep 17 00:00:00 2001 From: Nguyen Huy Hoang <24520554@gm.uit.edu.vn> Date: Thu, 26 Mar 2026 21:42:12 +0700 Subject: [PATCH 4/4] refactor: make `kernel_name` override update notebook `kernelspec` metadata Signed-off-by: Nguyen Huy Hoang <181364121+huyhoang171106@users.noreply.github.com> --- papermill/tests/test_cli.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/papermill/tests/test_cli.py b/papermill/tests/test_cli.py index 72ef5f9a..70a950aa 100755 --- a/papermill/tests/test_cli.py +++ b/papermill/tests/test_cli.py @@ -17,7 +17,7 @@ from .. import cli from ..cli import _is_float, _is_int, _resolve_type, papermill -from . import get_notebook_path, kernel_name +from . import get_notebook_path, kernel_name, override_kernel_name @pytest.mark.parametrize( @@ -72,6 +72,20 @@ def test_is_int(value, expected): assert (_is_int(value)) == expected +def test_kernel_override_updates_output_metadata(): + runner = CliRunner() + with tempfile.TemporaryDirectory() as tmp_dir: + output_path = os.path.join(tmp_dir, f"{uuid.uuid4().hex}.ipynb") + result = runner.invoke( + papermill, + [get_notebook_path('blank-vscode.ipynb'), output_path, '--prepare-only', '-k', override_kernel_name], + ) + assert result.exit_code == 0 + output_nb = nbformat.read(output_path, as_version=4) + assert output_nb.metadata.kernelspec.name == override_kernel_name + assert output_nb.metadata.kernelspec.display_name == override_kernel_name + + class TestCLI(unittest.TestCase): default_execute_kwargs = dict( input_path='input.ipynb',