From 40ff36c113c14f1c2c6da3297d66a237012f6679 Mon Sep 17 00:00:00 2001 From: Charles Cooper Date: Thu, 8 Jun 2023 08:21:02 -0700 Subject: [PATCH] fix: protect stdout/stderr restoration in InProcessKernel._redirected_io `contextlib.contextmanager` does not always run code following the `yield` statement. this commit adds a finally block to ensure that stdout and stderr are properly restored even in the presence of uncaught exceptions. --- ipykernel/inprocess/ipkernel.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ipykernel/inprocess/ipkernel.py b/ipykernel/inprocess/ipkernel.py index df34303b4..3f7fcce9e 100644 --- a/ipykernel/inprocess/ipkernel.py +++ b/ipykernel/inprocess/ipkernel.py @@ -121,9 +121,11 @@ def _input_request(self, prompt, ident, parent, password=False): def _redirected_io(self): """Temporarily redirect IO to the kernel.""" sys_stdout, sys_stderr = sys.stdout, sys.stderr - sys.stdout, sys.stderr = self.stdout, self.stderr - yield - sys.stdout, sys.stderr = sys_stdout, sys_stderr + try: + sys.stdout, sys.stderr = self.stdout, self.stderr + yield + finally: + sys.stdout, sys.stderr = sys_stdout, sys_stderr # ------ Trait change handlers --------------------------------------------