Skip to content

Commit

Permalink
jupyter-run: avoid traceback for NoSuchKernel
Browse files Browse the repository at this point in the history
NoSuchKernel used to raise during KernelManager instantiation,
but it is now delayed.

Access kernel_spec to ensure it's raised where it will be caught.

Also removes a redundant warning log immediately before raising,
which prevents complete handling of NoSuchError and produces unavoidable duplicate logs.
  • Loading branch information
minrk committed Sep 22, 2024
1 parent 3b1a9fe commit c37bfc5
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 2 deletions.
5 changes: 4 additions & 1 deletion jupyter_client/consoleapp.py
Original file line number Diff line number Diff line change
Expand Up @@ -306,8 +306,11 @@ def init_kernel_manager(self) -> None:
parent=self,
data_dir=self.data_dir,
)
# access kernel_spec to ensure the NoSuchKernel error is raised
# if it's going to be
kernel_spec = self.kernel_manager.kernel_spec # noqa: F841
except NoSuchKernel:
self.log.critical("Could not find kernel %s", self.kernel_name)
self.log.critical("Could not find kernel %r", self.kernel_name)
self.exit(1) # type:ignore[attr-defined]

self.kernel_manager = t.cast(KernelManager, self.kernel_manager)
Expand Down
1 change: 0 additions & 1 deletion jupyter_client/kernelspec.py
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,6 @@ def get_kernel_spec(self, kernel_name: str) -> KernelSpec:

resource_dir = self._find_spec_directory(kernel_name.lower())
if resource_dir is None:
self.log.warning("Kernelspec name %s cannot be found!", kernel_name)
raise NoSuchKernel(kernel_name)

return self._get_kernel_spec_by_name(kernel_name, resource_dir)
Expand Down
34 changes: 34 additions & 0 deletions tests/test_runapp.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import sys
from subprocess import run


def test_runapp(tmp_path):
test_py = tmp_path / "test.py"
with test_py.open("w") as f:
f.write("print('hello')")

p = run(
[sys.executable, "-m", "jupyter_client.runapp", str(test_py)],
capture_output=True,
text=True,
check=True,
)
assert p.stdout.strip() == "hello"


def test_no_such_kernel(tmp_path):
test_py = tmp_path / "test.py"
with test_py.open("w") as f:
f.write("print('hello')")
kernel_name = "nosuchkernel"
p = run(
[sys.executable, "-m", "jupyter_client.runapp", "--kernel", kernel_name, str(test_py)],
capture_output=True,
text=True,
check=False,
)
assert p.returncode
assert "Could not find kernel" in p.stderr
assert kernel_name in p.stderr
# shouldn't show a traceback
assert "Traceback" not in p.stderr

0 comments on commit c37bfc5

Please sign in to comment.