Skip to content

Commit 309d380

Browse files
authored
Merge pull request matplotlib#29721 from jayaddison/issue-29713/auto-backend-case-sensitivity-fixup
FIX: pyplot auto-backend detection case-sensitivity fixup
2 parents d1fb1be + 2ed08c1 commit 309d380

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

lib/matplotlib/pyplot.py

+9-6
Original file line numberDiff line numberDiff line change
@@ -2715,12 +2715,15 @@ def polar(*args, **kwargs) -> list[Line2D]:
27152715
# If rcParams['backend_fallback'] is true, and an interactive backend is
27162716
# requested, ignore rcParams['backend'] and force selection of a backend that
27172717
# is compatible with the current running interactive framework.
2718-
if (rcParams["backend_fallback"]
2719-
and rcParams._get_backend_or_none() in ( # type: ignore[attr-defined]
2720-
set(backend_registry.list_builtin(BackendFilter.INTERACTIVE)) -
2721-
{'webagg', 'nbagg'})
2722-
and cbook._get_running_interactive_framework()):
2723-
rcParams._set("backend", rcsetup._auto_backend_sentinel)
2718+
if rcParams["backend_fallback"]:
2719+
requested_backend = rcParams._get_backend_or_none() # type: ignore[attr-defined]
2720+
requested_backend = None if requested_backend is None else requested_backend.lower()
2721+
available_backends = backend_registry.list_builtin(BackendFilter.INTERACTIVE)
2722+
if (
2723+
requested_backend in (set(available_backends) - {'webagg', 'nbagg'})
2724+
and cbook._get_running_interactive_framework()
2725+
):
2726+
rcParams._set("backend", rcsetup._auto_backend_sentinel)
27242727

27252728
# fmt: on
27262729

lib/matplotlib/tests/test_rcparams.py

+24-1
Original file line numberDiff line numberDiff line change
@@ -521,10 +521,11 @@ def test_rcparams_reset_after_fail():
521521

522522

523523
@pytest.mark.skipif(sys.platform != "linux", reason="Linux only")
524-
def test_backend_fallback_headless(tmp_path):
524+
def test_backend_fallback_headless_invalid_backend(tmp_path):
525525
env = {**os.environ,
526526
"DISPLAY": "", "WAYLAND_DISPLAY": "",
527527
"MPLBACKEND": "", "MPLCONFIGDIR": str(tmp_path)}
528+
# plotting should fail with the tkagg backend selected in a headless environment
528529
with pytest.raises(subprocess.CalledProcessError):
529530
subprocess_run_for_testing(
530531
[sys.executable, "-c",
@@ -536,6 +537,28 @@ def test_backend_fallback_headless(tmp_path):
536537
env=env, check=True, stderr=subprocess.DEVNULL)
537538

538539

540+
@pytest.mark.skipif(sys.platform != "linux", reason="Linux only")
541+
def test_backend_fallback_headless_auto_backend(tmp_path):
542+
# specify a headless mpl environment, but request a graphical (tk) backend
543+
env = {**os.environ,
544+
"DISPLAY": "", "WAYLAND_DISPLAY": "",
545+
"MPLBACKEND": "TkAgg", "MPLCONFIGDIR": str(tmp_path)}
546+
547+
# allow fallback to an available interactive backend explicitly in configuration
548+
rc_path = tmp_path / "matplotlibrc"
549+
rc_path.write_text("backend_fallback: true")
550+
551+
# plotting should succeed, by falling back to use the generic agg backend
552+
backend = subprocess_run_for_testing(
553+
[sys.executable, "-c",
554+
"import matplotlib.pyplot;"
555+
"matplotlib.pyplot.plot(42);"
556+
"print(matplotlib.get_backend());"
557+
],
558+
env=env, text=True, check=True, capture_output=True).stdout
559+
assert backend.strip().lower() == "agg"
560+
561+
539562
@pytest.mark.skipif(
540563
sys.platform == "linux" and not _c_internal_utils.xdisplay_is_valid(),
541564
reason="headless")

0 commit comments

Comments
 (0)