Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 233aefa

Browse files
committed
Add KernelSpecManager.whitelist
set of allowed kernels by name Mainly useful for excluding the 'native' python2/3 kernel, but it's generic.
1 parent 7c34f17 commit 233aefa

3 files changed

Lines changed: 18 additions & 8 deletions

File tree

IPython/html/notebookapp.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ class NotebookApp(BaseIPythonApplication):
345345
classes = [
346346
KernelManager, ProfileDir, Session, MappingKernelManager,
347347
ContentsManager, FileContentsManager, NotebookNotary,
348+
KernelSpecManager,
348349
]
349350
flags = Dict(flags)
350351
aliases = Dict(aliases)
@@ -650,9 +651,6 @@ def _mathjax_url_changed(self, name, old, new):
650651

651652
kernel_spec_manager = Instance(KernelSpecManager)
652653

653-
def _kernel_spec_manager_default(self):
654-
return KernelSpecManager(ipython_dir=self.ipython_dir)
655-
656654
kernel_spec_manager_class = Type(
657655
default_value=KernelSpecManager,
658656
config=True,
@@ -766,6 +764,7 @@ def init_configurables(self):
766764
default_secure(self.config)
767765

768766
self.kernel_spec_manager = self.kernel_spec_manager_class(
767+
parent=self,
769768
ipython_dir=self.ipython_dir,
770769
)
771770
self.kernel_manager = self.kernel_manager_class(

IPython/kernel/kernelspec.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88

99
from IPython.utils.path import get_ipython_dir
1010
from IPython.utils.py3compat import PY3
11-
from IPython.utils.traitlets import HasTraits, List, Unicode, Dict, Any
11+
from IPython.utils.traitlets import HasTraits, List, Unicode, Dict, Any, Set
12+
from IPython.config import Configurable
1213
from .launcher import make_ipkernel_cmd
1314

1415
if os.name == 'nt':
@@ -81,7 +82,7 @@ class NoSuchKernel(KeyError):
8182
def __init__(self, name):
8283
self.name = name
8384

84-
class KernelSpecManager(HasTraits):
85+
class KernelSpecManager(Configurable):
8586
ipython_dir = Unicode()
8687
def _ipython_dir_default(self):
8788
return get_ipython_dir()
@@ -94,9 +95,15 @@ def _user_kernel_dir_default(self):
9495
def env_kernel_dir(self):
9596
return pjoin(sys.prefix, 'share', 'jupyter', 'kernels')
9697

98+
whitelist = Set(config=True,
99+
help="""Whitelist of allowed kernel names.
100+
101+
By default, all installed kernels are allowed.
102+
"""
103+
)
97104
kernel_dirs = List(
98105
help="List of kernel directories to search. Later ones take priority over earlier."
99-
)
106+
)
100107
def _kernel_dirs_default(self):
101108
dirs = SYSTEM_KERNEL_DIRS[:]
102109
if self.env_kernel_dir not in dirs:
@@ -128,6 +135,9 @@ def find_kernel_specs(self):
128135
d.update(_list_kernels_in(kernel_dir))
129136

130137
d[NATIVE_KERNEL_NAME] = self._native_kernel_resource_dir
138+
if self.whitelist:
139+
# filter if there's a whitelist
140+
d = {name:spec for name,spec in d.items() if name in self.whitelist}
131141
return d
132142
# TODO: Caching?
133143

@@ -136,7 +146,8 @@ def get_kernel_spec(self, kernel_name):
136146
137147
Raises :exc:`NoSuchKernel` if the given kernel name is not found.
138148
"""
139-
if kernel_name in {'python', NATIVE_KERNEL_NAME}:
149+
if kernel_name in {'python', NATIVE_KERNEL_NAME} and \
150+
(not self.whitelist or kernel_name in self.whitelist):
140151
return KernelSpec(resource_dir=self._native_kernel_resource_dir,
141152
**self._native_kernel_dict)
142153

IPython/kernel/kernelspecapp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class ListKernelSpecs(BaseIPythonApplication):
2222
flags = {'debug': base_flags['debug'],}
2323

2424
def _kernel_spec_manager_default(self):
25-
return KernelSpecManager(ipython_dir=self.ipython_dir)
25+
return KernelSpecManager(parent=self, ipython_dir=self.ipython_dir)
2626

2727
def start(self):
2828
print("Available kernels:")

0 commit comments

Comments
 (0)