Skip to content

Commit 363b6e2

Browse files
committed
jupyter-run: avoid traceback for NoSuchKernel
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.
1 parent 586cbb3 commit 363b6e2

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

jupyter_client/consoleapp.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,11 @@ def init_kernel_manager(self) -> None:
306306
parent=self,
307307
data_dir=self.data_dir,
308308
)
309+
# access kernel_spec to ensure the NoSuchKernel error is raised
310+
# if it's going to be
311+
kernel_spec = self.kernel_manager.kernel_spec # noqa: F841
309312
except NoSuchKernel:
310-
self.log.critical("Could not find kernel %s", self.kernel_name)
313+
self.log.critical("Could not find kernel %r", self.kernel_name)
311314
self.exit(1) # type:ignore[attr-defined]
312315

313316
self.kernel_manager = t.cast(KernelManager, self.kernel_manager)

jupyter_client/kernelspec.py

-1
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,6 @@ def get_kernel_spec(self, kernel_name: str) -> KernelSpec:
281281

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

287286
return self._get_kernel_spec_by_name(kernel_name, resource_dir)

tests/test_runapp.py

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import sys
2+
from subprocess import run
3+
4+
5+
def test_runapp(tmp_path):
6+
test_py = tmp_path / "test.py"
7+
with test_py.open("w") as f:
8+
f.write("print('hello')")
9+
10+
p = run(
11+
[sys.executable, "-m", "jupyter_client.runapp", str(test_py)],
12+
capture_output=True,
13+
text=True,
14+
check=True,
15+
)
16+
assert p.stdout.strip() == "hello"
17+
18+
19+
def test_no_such_kernel(tmp_path):
20+
test_py = tmp_path / "test.py"
21+
with test_py.open("w") as f:
22+
f.write("print('hello')")
23+
kernel_name = "nosuchkernel"
24+
p = run(
25+
[sys.executable, "-m", "jupyter_client.runapp", "--kernel", kernel_name, str(test_py)],
26+
capture_output=True,
27+
text=True,
28+
check=False,
29+
)
30+
assert p.returncode
31+
assert "Could not find kernel" in p.stderr
32+
assert kernel_name in p.stderr
33+
# shouldn't show a traceback
34+
assert "Traceback" not in p.stderr

0 commit comments

Comments
 (0)