##// END OF EJS Templates
Update whatsnew from PR files
Update whatsnew from PR files

File last commit:

r16722:517a50eb
r17297:d6c918ae
Show More
kernelspecapp.py
121 lines | 4.1 KiB | text/x-python | PythonLexer
Thomas Kluyver
Add kernelspec command line entry point
r16560
# Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License.
import errno
import os.path
from IPython.config.application import Application
Thomas Kluyver
Trim which options are exposed on kernelspec CLI
r16597 from IPython.core.application import (
BaseIPythonApplication, base_flags, base_aliases
)
Thomas Kluyver
Add kernelspec command line entry point
r16560 from IPython.utils.traitlets import Instance, Dict, Unicode, Bool
from .kernelspec import KernelSpecManager
def _pythonfirst(s):
"Sort key function that will put strings starting with 'python' first."
if s.startswith('python'):
Thomas Kluyver
Deterministic sort for kernelspec list, better error for install
r16722 # Space is not valid in kernel names, so this should sort first
return ' ' + s
Thomas Kluyver
Add kernelspec command line entry point
r16560 return s
class ListKernelSpecs(BaseIPythonApplication):
description = """List installed kernel specifications."""
kernel_spec_manager = Instance(KernelSpecManager)
Thomas Kluyver
Trim which options are exposed on kernelspec CLI
r16597
# Not all of the base aliases are meaningful (e.g. profile)
aliases = {k: base_aliases[k] for k in ['ipython-dir', 'log-level']}
flags = {'debug': base_flags['debug'],}
Thomas Kluyver
Add kernelspec command line entry point
r16560
def _kernel_spec_manager_default(self):
return KernelSpecManager(ipython_dir=self.ipython_dir)
def start(self):
print("Available kernels:")
for kernelname in sorted(self.kernel_spec_manager.find_kernel_specs(),
key=_pythonfirst):
print(" %s" % kernelname)
class InstallKernelSpec(BaseIPythonApplication):
description = """Install a kernel specification directory."""
kernel_spec_manager = Instance(KernelSpecManager)
def _kernel_spec_manager_default(self):
return KernelSpecManager(ipython_dir=self.ipython_dir)
sourcedir = Unicode()
kernel_name = Unicode("", config=True,
help="Install the kernel spec with this name"
)
def _kernel_name_default(self):
return os.path.basename(self.sourcedir)
system = Bool(False, config=True,
help="""
Try to install the kernel spec to the systemwide directory instead of
the per-user directory.
"""
)
replace = Bool(False, config=True,
help="Replace any existing kernel spec with this name."
)
aliases = {'name': 'InstallKernelSpec.kernel_name'}
Thomas Kluyver
Trim which options are exposed on kernelspec CLI
r16597 for k in ['ipython-dir', 'log-level']:
aliases[k] = base_aliases[k]
Thomas Kluyver
Add kernelspec command line entry point
r16560
flags = {'system': ({'InstallKernelSpec': {'system': True}},
"Install to the systemwide kernel registry"),
'replace': ({'InstallKernelSpec': {'replace': True}},
"Replace any existing kernel spec with this name."),
Thomas Kluyver
Trim which options are exposed on kernelspec CLI
r16597 'debug': base_flags['debug'],
Thomas Kluyver
Add kernelspec command line entry point
r16560 }
def parse_command_line(self, argv):
super(InstallKernelSpec, self).parse_command_line(argv)
# accept positional arg as profile name
if self.extra_args:
self.sourcedir = self.extra_args[0]
else:
print("No source directory specified.")
self.exit(1)
def start(self):
try:
self.kernel_spec_manager.install_kernel_spec(self.sourcedir,
kernel_name=self.kernel_name,
system=self.system,
replace=self.replace,
)
except OSError as e:
if e.errno == errno.EACCES:
print("Permission denied")
self.exit(1)
elif e.errno == errno.EEXIST:
Thomas Kluyver
Deterministic sort for kernelspec list, better error for install
r16722 print("A kernel spec is already present at %s" % e.filename)
Thomas Kluyver
Add kernelspec command line entry point
r16560 self.exit(1)
raise
class KernelSpecApp(Application):
Thomas Kluyver
Fix applications displaying subcommands
r16561 name = "ipython kernelspec"
Thomas Kluyver
Add kernelspec command line entry point
r16560 description = """Manage IPython kernel specifications."""
subcommands = Dict(dict(
list = (ListKernelSpecs, ListKernelSpecs.description.splitlines()[0]),
install = (InstallKernelSpec, InstallKernelSpec.description.splitlines()[0])
))
Thomas Kluyver
Trim which options are exposed on kernelspec CLI
r16597
aliases = {}
flags = {}
Thomas Kluyver
Add kernelspec command line entry point
r16560
def start(self):
if self.subapp is None:
print("No subcommand specified. Must specify one of: %s"% list(self.subcommands))
print()
self.print_description()
self.print_subcommands()
self.exit(1)
else:
return self.subapp.start()