Show More
@@ -0,0 +1,109 b'' | |||
|
1 | ||
|
2 | # Copyright (c) IPython Development Team. | |
|
3 | # Distributed under the terms of the Modified BSD License. | |
|
4 | ||
|
5 | import errno | |
|
6 | import os.path | |
|
7 | ||
|
8 | from IPython.config.application import Application | |
|
9 | from IPython.core.application import BaseIPythonApplication, base_flags | |
|
10 | from IPython.utils.traitlets import Instance, Dict, Unicode, Bool | |
|
11 | ||
|
12 | from .kernelspec import KernelSpecManager | |
|
13 | ||
|
14 | def _pythonfirst(s): | |
|
15 | "Sort key function that will put strings starting with 'python' first." | |
|
16 | if s.startswith('python'): | |
|
17 | return '' | |
|
18 | return s | |
|
19 | ||
|
20 | class ListKernelSpecs(BaseIPythonApplication): | |
|
21 | description = """List installed kernel specifications.""" | |
|
22 | kernel_spec_manager = Instance(KernelSpecManager) | |
|
23 | ||
|
24 | def _kernel_spec_manager_default(self): | |
|
25 | return KernelSpecManager(ipython_dir=self.ipython_dir) | |
|
26 | ||
|
27 | def start(self): | |
|
28 | print("Available kernels:") | |
|
29 | for kernelname in sorted(self.kernel_spec_manager.find_kernel_specs(), | |
|
30 | key=_pythonfirst): | |
|
31 | print(" %s" % kernelname) | |
|
32 | ||
|
33 | ||
|
34 | class InstallKernelSpec(BaseIPythonApplication): | |
|
35 | description = """Install a kernel specification directory.""" | |
|
36 | kernel_spec_manager = Instance(KernelSpecManager) | |
|
37 | ||
|
38 | def _kernel_spec_manager_default(self): | |
|
39 | return KernelSpecManager(ipython_dir=self.ipython_dir) | |
|
40 | ||
|
41 | sourcedir = Unicode() | |
|
42 | kernel_name = Unicode("", config=True, | |
|
43 | help="Install the kernel spec with this name" | |
|
44 | ) | |
|
45 | def _kernel_name_default(self): | |
|
46 | return os.path.basename(self.sourcedir) | |
|
47 | ||
|
48 | system = Bool(False, config=True, | |
|
49 | help=""" | |
|
50 | Try to install the kernel spec to the systemwide directory instead of | |
|
51 | the per-user directory. | |
|
52 | """ | |
|
53 | ) | |
|
54 | replace = Bool(False, config=True, | |
|
55 | help="Replace any existing kernel spec with this name." | |
|
56 | ) | |
|
57 | ||
|
58 | aliases = {'name': 'InstallKernelSpec.kernel_name'} | |
|
59 | ||
|
60 | flags = {'system': ({'InstallKernelSpec': {'system': True}}, | |
|
61 | "Install to the systemwide kernel registry"), | |
|
62 | 'replace': ({'InstallKernelSpec': {'replace': True}}, | |
|
63 | "Replace any existing kernel spec with this name."), | |
|
64 | } | |
|
65 | flags.update(base_flags) | |
|
66 | ||
|
67 | def parse_command_line(self, argv): | |
|
68 | super(InstallKernelSpec, self).parse_command_line(argv) | |
|
69 | # accept positional arg as profile name | |
|
70 | if self.extra_args: | |
|
71 | self.sourcedir = self.extra_args[0] | |
|
72 | else: | |
|
73 | print("No source directory specified.") | |
|
74 | self.exit(1) | |
|
75 | ||
|
76 | def start(self): | |
|
77 | try: | |
|
78 | self.kernel_spec_manager.install_kernel_spec(self.sourcedir, | |
|
79 | kernel_name=self.kernel_name, | |
|
80 | system=self.system, | |
|
81 | replace=self.replace, | |
|
82 | ) | |
|
83 | except OSError as e: | |
|
84 | if e.errno == errno.EACCES: | |
|
85 | print("Permission denied") | |
|
86 | self.exit(1) | |
|
87 | elif e.errno == errno.EEXIST: | |
|
88 | print("A kernel spec named %r is already present" % self.kernel_name) | |
|
89 | self.exit(1) | |
|
90 | raise | |
|
91 | ||
|
92 | class KernelSpecApp(Application): | |
|
93 | name = "ipython-kernelspec" | |
|
94 | description = """Manage IPython kernel specifications.""" | |
|
95 | ||
|
96 | subcommands = Dict(dict( | |
|
97 | list = (ListKernelSpecs, ListKernelSpecs.description.splitlines()[0]), | |
|
98 | install = (InstallKernelSpec, InstallKernelSpec.description.splitlines()[0]) | |
|
99 | )) | |
|
100 | ||
|
101 | def start(self): | |
|
102 | if self.subapp is None: | |
|
103 | print("No subcommand specified. Must specify one of: %s"% list(self.subcommands)) | |
|
104 | print() | |
|
105 | self.print_description() | |
|
106 | self.print_subcommands() | |
|
107 | self.exit(1) | |
|
108 | else: | |
|
109 | return self.subapp.start() |
@@ -250,6 +250,9 b' class TerminalIPythonApp(BaseIPythonApplication, InteractiveShellApp):' | |||
|
250 | 250 | trust=('IPython.nbformat.sign.TrustNotebookApp', |
|
251 | 251 | "Sign notebooks to trust their potentially unsafe contents at load." |
|
252 | 252 | ), |
|
253 | kernelspec=('IPython.kernel.kernelspecapp.KernelSpecApp', | |
|
254 | "Manage IPython kernel specifications." | |
|
255 | ), | |
|
253 | 256 | ) |
|
254 | 257 | subcommands['install-nbextension'] = ( |
|
255 | 258 | "IPython.html.nbextensions.NBExtensionApp", |
General Comments 0
You need to be logged in to leave comments.
Login now