You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by ja...@apache.org on 2026/04/19 13:41:18 UTC

(airflow) branch main updated: Support log_output for PapermillOperator (#65170)

This is an automated email from the ASF dual-hosted git repository.

jason810496 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 418af2bb7ea Support log_output for PapermillOperator (#65170)
418af2bb7ea is described below

commit 418af2bb7ea365a453c322c3f3c25256587c2b19
Author: Aaron Chen <na...@gmail.com>
AuthorDate: Sun Apr 19 06:41:10 2026 -0700

    Support log_output for PapermillOperator (#65170)
---
 .../airflow/providers/papermill/operators/papermill.py   |  5 +++++
 .../tests/unit/papermill/operators/test_papermill.py     | 16 ++++++++++++++++
 2 files changed, 21 insertions(+)

diff --git a/providers/papermill/src/airflow/providers/papermill/operators/papermill.py b/providers/papermill/src/airflow/providers/papermill/operators/papermill.py
index 9043c593291..f41240ab263 100644
--- a/providers/papermill/src/airflow/providers/papermill/operators/papermill.py
+++ b/providers/papermill/src/airflow/providers/papermill/operators/papermill.py
@@ -54,6 +54,8 @@ class PapermillOperator(BaseOperator):
     :param parameters: the notebook parameters to set
     :param kernel_name: (optional) name of kernel to execute the notebook against
         (ignores kernel name in the notebook document metadata)
+    :param log_output: (optional) Log the notebook cell output to the task log.
+        When True, the stdout/stderr of each cell execution is visible in the Airflow task log.
     """
 
     # TODO: Remove this when provider drops 2.x support.
@@ -79,6 +81,7 @@ class PapermillOperator(BaseOperator):
         kernel_name: str | None = None,
         language_name: str | None = None,
         kernel_conn_id: str | None = None,
+        log_output: bool = False,
         nbconvert: bool = False,
         nbconvert_args: list[str] | None = None,
         **kwargs,
@@ -97,6 +100,7 @@ class PapermillOperator(BaseOperator):
         self.kernel_name = kernel_name
         self.language_name = language_name
         self.kernel_conn_id = kernel_conn_id
+        self.log_output = log_output
         self.nbconvert = nbconvert
         self.nbconvert_args = nbconvert_args
 
@@ -131,6 +135,7 @@ class PapermillOperator(BaseOperator):
             parameters=self.input_nb.parameters,
             progress_bar=False,
             report_mode=True,
+            log_output=self.log_output,
             kernel_name=self.kernel_name,
             language=self.language_name,
             engine_name=engine_name,
diff --git a/providers/papermill/tests/unit/papermill/operators/test_papermill.py b/providers/papermill/tests/unit/papermill/operators/test_papermill.py
index 4b467723dc0..f911fb83658 100644
--- a/providers/papermill/tests/unit/papermill/operators/test_papermill.py
+++ b/providers/papermill/tests/unit/papermill/operators/test_papermill.py
@@ -118,6 +118,7 @@ class TestPapermillOperator:
             language=language_name,
             progress_bar=False,
             report_mode=True,
+            log_output=False,
             engine_name=None,
         )
 
@@ -166,6 +167,7 @@ class TestPapermillOperator:
             language=language_name,
             progress_bar=False,
             report_mode=True,
+            log_output=False,
             engine_name=REMOTE_KERNEL_ENGINE,
             kernel_session_key="notebooks",
             kernel_shell_port=JUPYTER_KERNEL_SHELL_PORT,
@@ -176,6 +178,20 @@ class TestPapermillOperator:
             kernel_ip="127.0.0.1",
         )
 
+    @patch("airflow.providers.papermill.operators.papermill.pm")
+    def test_execute_with_log_output(self, mock_papermill):
+        from airflow.providers.papermill.operators.papermill import PapermillOperator
+
+        op = PapermillOperator(
+            input_nb="/tmp/in.ipynb",
+            output_nb="/tmp/out.ipynb",
+            task_id="test_log_output",
+            log_output=True,
+        )
+        op.execute(context={})
+        call_kwargs = mock_papermill.execute_notebook.call_args
+        assert call_kwargs.kwargs["log_output"] is True
+
     @pytest.mark.db_test
     def test_render_template(self, create_task_instance_of_operator):
         """Test rendering fields."""