|
3 | 3 | # Copyright (c) Jupyter Development Team.
|
4 | 4 | # Distributed under the terms of the Modified BSD License.
|
5 | 5 |
|
| 6 | +import errno |
6 | 7 | import io
|
7 | 8 | import json
|
8 | 9 | import os
|
@@ -199,15 +200,39 @@ def _get_kernel_spec_by_name(self, kernel_name, resource_dir):
|
199 | 200 |
|
200 | 201 | return self.kernel_spec_class.from_resource_dir(resource_dir)
|
201 | 202 |
|
| 203 | + def _find_spec_directory(self, kernel_name): |
| 204 | + """Find the resource directory of a named kernel spec""" |
| 205 | + for kernel_dir in self.kernel_dirs: |
| 206 | + try: |
| 207 | + files = os.listdir(kernel_dir) |
| 208 | + except OSError as e: |
| 209 | + if e.errno in (errno.ENOTDIR, errno.ENOENT): |
| 210 | + continue |
| 211 | + raise |
| 212 | + for f in files: |
| 213 | + path = pjoin(kernel_dir, f) |
| 214 | + if f.lower() == kernel_name and _is_kernel_dir(path): |
| 215 | + return path |
| 216 | + |
| 217 | + if kernel_name == NATIVE_KERNEL_NAME: |
| 218 | + try: |
| 219 | + from ipykernel.kernelspec import RESOURCES |
| 220 | + except ImportError: |
| 221 | + pass |
| 222 | + else: |
| 223 | + return RESOURCES |
| 224 | + |
202 | 225 | def get_kernel_spec(self, kernel_name):
|
203 | 226 | """Returns a :class:`KernelSpec` instance for the given kernel_name.
|
204 | 227 |
|
205 | 228 | Raises :exc:`NoSuchKernel` if the given kernel name is not found.
|
206 | 229 | """
|
207 |
| - d = self.find_kernel_specs() |
208 |
| - try: |
209 |
| - resource_dir = d[kernel_name.lower()] |
210 |
| - except KeyError: |
| 230 | + if not _is_valid_kernel_name(kernel_name): |
| 231 | + self.log.warning("Kernelspec name %r is invalid: %s", kernel_name, |
| 232 | + _kernel_name_description) |
| 233 | + |
| 234 | + resource_dir = self._find_spec_directory(kernel_name.lower()) |
| 235 | + if resource_dir is None: |
211 | 236 | raise NoSuchKernel(kernel_name)
|
212 | 237 |
|
213 | 238 | return self._get_kernel_spec_by_name(kernel_name, resource_dir)
|
|
0 commit comments