@@ -104,7 +104,6 @@ def _copy_docstring_and_deprecators(method, func=None):
104104
105105## Global ##
106106
107-
108107_IP_REGISTERED = None
109108_INSTALL_FIG_OBSERVER = False
110109
@@ -202,6 +201,28 @@ def _get_required_interactive_framework(backend_mod):
202201 return getattr (
203202 backend_mod .FigureCanvas , "required_interactive_framework" , None )
204203
204+ _backend_mod = None
205+
206+
207+ def _get_backend_mod ():
208+ """
209+ Ensure that a backend is selected and return it.
210+
211+ This is currently private, but may be made public in the future.
212+ """
213+ if _backend_mod is None :
214+ # Use __getitem__ here to avoid going through the fallback logic (which
215+ # will (re)import pyplot and then call switch_backend if we need to
216+ # resolve the auto sentinel)
217+ switch_backend (dict .__getitem__ (rcParams , "backend" ))
218+ # Just to be safe. Interactive mode can be turned on without calling
219+ # `plt.ion()` so register it again here. This is safe because multiple
220+ # calls to `install_repl_displayhook` are no-ops and the registered
221+ # function respects `mpl.is_interactive()` to determine if it should
222+ # trigger a draw.
223+ install_repl_displayhook ()
224+ return _backend_mod
225+
205226
206227def switch_backend (newbackend ):
207228 """
@@ -292,7 +313,7 @@ class backend_mod(matplotlib.backend_bases._Backend):
292313
293314
294315def _warn_if_gui_out_of_main_thread ():
295- if (_get_required_interactive_framework (_backend_mod )
316+ if (_get_required_interactive_framework (_get_backend_mod () )
296317 and threading .current_thread () is not threading .main_thread ()):
297318 _api .warn_external (
298319 "Starting a Matplotlib GUI outside of the main thread will likely "
@@ -303,7 +324,7 @@ def _warn_if_gui_out_of_main_thread():
303324def new_figure_manager (* args , ** kwargs ):
304325 """Create a new figure manager instance."""
305326 _warn_if_gui_out_of_main_thread ()
306- return _backend_mod .new_figure_manager (* args , ** kwargs )
327+ return _get_backend_mod () .new_figure_manager (* args , ** kwargs )
307328
308329
309330# This function's signature is rewritten upon backend-load by switch_backend.
@@ -316,7 +337,7 @@ def draw_if_interactive(*args, **kwargs):
316337 End users will typically not have to call this function because the
317338 the interactive mode takes care of this.
318339 """
319- return _backend_mod .draw_if_interactive (* args , ** kwargs )
340+ return _get_backend_mod () .draw_if_interactive (* args , ** kwargs )
320341
321342
322343# This function's signature is rewritten upon backend-load by switch_backend.
@@ -365,7 +386,7 @@ def show(*args, **kwargs):
365386 explicitly there.
366387 """
367388 _warn_if_gui_out_of_main_thread ()
368- return _backend_mod .show (* args , ** kwargs )
389+ return _get_backend_mod () .show (* args , ** kwargs )
369390
370391
371392def isinteractive ():
@@ -2226,15 +2247,6 @@ def polar(*args, **kwargs):
22262247 set (_interactive_bk ) - {'WebAgg' , 'nbAgg' })
22272248 and cbook ._get_running_interactive_framework ()):
22282249 dict .__setitem__ (rcParams , "backend" , rcsetup ._auto_backend_sentinel )
2229- # Set up the backend.
2230- switch_backend (rcParams ["backend" ])
2231-
2232- # Just to be safe. Interactive mode can be turned on without
2233- # calling `plt.ion()` so register it again here.
2234- # This is safe because multiple calls to `install_repl_displayhook`
2235- # are no-ops and the registered function respect `mpl.is_interactive()`
2236- # to determine if they should trigger a draw.
2237- install_repl_displayhook ()
22382250
22392251
22402252################# REMAINING CONTENT GENERATED BY boilerplate.py ##############
0 commit comments