##// END OF EJS Templates
Correctly handle "ipython --matplotlib=<whatever>"
Ian Thomas -
Show More
@@ -93,17 +93,12 b' class PylabMagics(Magics):'
93 """
93 """
94 args = magic_arguments.parse_argstring(self.matplotlib, line)
94 args = magic_arguments.parse_argstring(self.matplotlib, line)
95 if args.list:
95 if args.list:
96 from IPython.core.pylabtools import _matplotlib_manages_backends
96 from IPython.core.pylabtools import _list_matplotlib_backends_and_gui_loops
97
97
98 if _matplotlib_manages_backends():
98 print(
99 from matplotlib.backends.registry import backend_registry
99 "Available matplotlib backends: %s"
100
100 % _list_matplotlib_backends_and_gui_loops()
101 backends_list = backend_registry.list_all()
101 )
102 else:
103 from IPython.core.pylabtools import backends
104
105 backends_list = list(backends.keys())
106 print("Available matplotlib backends: %s" % backends_list)
107 else:
102 else:
108 gui, backend = self.shell.enable_matplotlib(args.gui.lower() if isinstance(args.gui, str) else args.gui)
103 gui, backend = self.shell.enable_matplotlib(args.gui.lower() if isinstance(args.gui, str) else args.gui)
109 self._show_matplotlib_backend(args.gui, backend)
104 self._show_matplotlib_backend(args.gui, backend)
@@ -483,7 +483,8 b' def _matplotlib_manages_backends() -> bool:'
483
483
484 If it returns True, the caller can be sure that
484 If it returns True, the caller can be sure that
485 matplotlib.backends.registry.backend_registry is available along with
485 matplotlib.backends.registry.backend_registry is available along with
486 member functions resolve_gui_or_backend, resolve_backend and list_all.
486 member functions resolve_gui_or_backend, resolve_backend, list_all, and
487 list_gui_frameworks.
487 """
488 """
488 global _matplotlib_manages_backends_value
489 global _matplotlib_manages_backends_value
489 if _matplotlib_manages_backends_value is None:
490 if _matplotlib_manages_backends_value is None:
@@ -497,3 +498,21 b' def _matplotlib_manages_backends() -> bool:'
497 _matplotlib_manages_backends_value = False
498 _matplotlib_manages_backends_value = False
498
499
499 return _matplotlib_manages_backends_value
500 return _matplotlib_manages_backends_value
501
502
503 def _list_matplotlib_backends_and_gui_loops() -> list[str]:
504 """Return list of all Matplotlib backends and GUI event loops.
505
506 This is the list returned by
507 %matplotlib --list
508 """
509 if _matplotlib_manages_backends():
510 from matplotlib.backends.registry import backend_registry
511
512 ret = backend_registry.list_all() + backend_registry.list_gui_frameworks()
513 else:
514 from IPython.core import pylabtools
515
516 ret = list(pylabtools.backends.keys())
517
518 return sorted(["auto"] + ret)
@@ -11,36 +11,45 b' import glob'
11 from itertools import chain
11 from itertools import chain
12 import os
12 import os
13 import sys
13 import sys
14 import typing as t
14
15
15 from traitlets.config.application import boolean_flag
16 from traitlets.config.application import boolean_flag
16 from traitlets.config.configurable import Configurable
17 from traitlets.config.configurable import Configurable
17 from traitlets.config.loader import Config
18 from traitlets.config.loader import Config
18 from IPython.core.application import SYSTEM_CONFIG_DIRS, ENV_CONFIG_DIRS
19 from IPython.core.application import SYSTEM_CONFIG_DIRS, ENV_CONFIG_DIRS
19 from IPython.core import pylabtools
20 from IPython.utils.contexts import preserve_keys
20 from IPython.utils.contexts import preserve_keys
21 from IPython.utils.path import filefind
21 from IPython.utils.path import filefind
22 from traitlets import (
22 from traitlets import (
23 Unicode, Instance, List, Bool, CaselessStrEnum, observe,
23 Unicode,
24 Instance,
25 List,
26 Bool,
27 CaselessStrEnum,
28 observe,
24 DottedObjectName,
29 DottedObjectName,
30 Undefined,
25 )
31 )
26 from IPython.terminal import pt_inputhooks
32 from IPython.terminal import pt_inputhooks
27
33
28 #-----------------------------------------------------------------------------
34 # -----------------------------------------------------------------------------
29 # Aliases and Flags
35 # Aliases and Flags
30 #-----------------------------------------------------------------------------
36 # -----------------------------------------------------------------------------
31
37
32 gui_keys = tuple(sorted(pt_inputhooks.backends) + sorted(pt_inputhooks.aliases))
38 gui_keys = tuple(sorted(pt_inputhooks.backends) + sorted(pt_inputhooks.aliases))
33
39
34 backend_keys: list[str] = []
35
36 shell_flags = {}
40 shell_flags = {}
37
41
38 addflag = lambda *args: shell_flags.update(boolean_flag(*args))
42 addflag = lambda *args: shell_flags.update(boolean_flag(*args))
39 addflag('autoindent', 'InteractiveShell.autoindent',
43 addflag(
40 'Turn on autoindenting.', 'Turn off autoindenting.'
44 "autoindent",
45 "InteractiveShell.autoindent",
46 "Turn on autoindenting.",
47 "Turn off autoindenting.",
41 )
48 )
42 addflag('automagic', 'InteractiveShell.automagic',
49 addflag(
43 """Turn on the auto calling of magic commands. Type %%magic at the
50 "automagic",
51 "InteractiveShell.automagic",
52 """Turn on the auto calling of magic commands. Type %%magic at the
44 IPython prompt for more information.""",
53 IPython prompt for more information.""",
45 'Turn off the auto calling of magic commands.'
54 'Turn off the auto calling of magic commands.'
46 )
55 )
@@ -96,6 +105,37 b' shell_aliases = dict('
96 )
105 )
97 shell_aliases['cache-size'] = 'InteractiveShell.cache_size'
106 shell_aliases['cache-size'] = 'InteractiveShell.cache_size'
98
107
108
109 # -----------------------------------------------------------------------------
110 # Traitlets
111 # -----------------------------------------------------------------------------
112
113
114 class MatplotlibBackendCaselessStrEnum(CaselessStrEnum):
115 """An enum of Matplotlib backend strings where the case should be ignored.
116
117 Prior to Matplotlib 3.9.1 the list of valid backends is hardcoded in
118 pylabtools.backends. After that, Matplotlib manages backends.
119
120 The list of valid backends is determined when it is first needed to avoid
121 wasting unnecessary initialisation time.
122 """
123
124 def __init__(
125 self: CaselessStrEnum[t.Any],
126 default_value: t.Any = Undefined,
127 **kwargs: t.Any,
128 ) -> None:
129 super().__init__(None, default_value=default_value, **kwargs)
130
131 def __getattribute__(self, name):
132 if name == "values" and object.__getattribute__(self, name) is None:
133 from IPython.core.pylabtools import _list_matplotlib_backends_and_gui_loops
134
135 self.values = _list_matplotlib_backends_and_gui_loops()
136 return object.__getattribute__(self, name)
137
138
99 #-----------------------------------------------------------------------------
139 #-----------------------------------------------------------------------------
100 # Main classes and functions
140 # Main classes and functions
101 #-----------------------------------------------------------------------------
141 #-----------------------------------------------------------------------------
@@ -155,30 +195,31 b' class InteractiveShellApp(Configurable):'
155 exec_lines = List(Unicode(),
195 exec_lines = List(Unicode(),
156 help="""lines of code to run at IPython startup."""
196 help="""lines of code to run at IPython startup."""
157 ).tag(config=True)
197 ).tag(config=True)
158 code_to_run = Unicode('',
198 code_to_run = Unicode("", help="Execute the given command string.").tag(config=True)
159 help="Execute the given command string."
199 module_to_run = Unicode("", help="Run the module as a script.").tag(config=True)
160 ).tag(config=True)
200 gui = CaselessStrEnum(
161 module_to_run = Unicode('',
201 gui_keys,
162 help="Run the module as a script."
202 allow_none=True,
203 help="Enable GUI event loop integration with any of {0}.".format(gui_keys),
163 ).tag(config=True)
204 ).tag(config=True)
164 gui = CaselessStrEnum(gui_keys, allow_none=True,
205 matplotlib = MatplotlibBackendCaselessStrEnum(
165 help="Enable GUI event loop integration with any of {0}.".format(gui_keys)
206 allow_none=True,
166 ).tag(config=True)
167 matplotlib = CaselessStrEnum(backend_keys, allow_none=True,
168 help="""Configure matplotlib for interactive use with
207 help="""Configure matplotlib for interactive use with
169 the default matplotlib backend."""
208 the default matplotlib backend.""",
170 ).tag(config=True)
209 ).tag(config=True)
171 pylab = CaselessStrEnum(backend_keys, allow_none=True,
210 pylab = MatplotlibBackendCaselessStrEnum(
211 allow_none=True,
172 help="""Pre-load matplotlib and numpy for interactive use,
212 help="""Pre-load matplotlib and numpy for interactive use,
173 selecting a particular matplotlib backend and loop integration.
213 selecting a particular matplotlib backend and loop integration.
174 """
214 """,
175 ).tag(config=True)
215 ).tag(config=True)
176 pylab_import_all = Bool(True,
216 pylab_import_all = Bool(
217 True,
177 help="""If true, IPython will populate the user namespace with numpy, pylab, etc.
218 help="""If true, IPython will populate the user namespace with numpy, pylab, etc.
178 and an ``import *`` is done from numpy and pylab, when using pylab mode.
219 and an ``import *`` is done from numpy and pylab, when using pylab mode.
179
220
180 When False, pylab mode should not import any names into the user namespace.
221 When False, pylab mode should not import any names into the user namespace.
181 """
222 """,
182 ).tag(config=True)
223 ).tag(config=True)
183 ignore_cwd = Bool(
224 ignore_cwd = Bool(
184 False,
225 False,
General Comments 0
You need to be logged in to leave comments. Login now