Fix: stop forcing matplotlib Agg backend on import (closes #2) - #4
Merged
Conversation
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #2.
_core.pycalledmatplotlib.use("Agg")at import time, and every measureimports
_core— sofrom entroscope import shannonsilently switched theuser's whole matplotlib backend, breaking interactive plotting like
df["feature"].plot()in notebooks (reported by @StatisticianOne).Fix
_core.py; let matplotlib resolve its own(it already falls back to a non-interactive backend when there's no display).
Headless safety moved to the environment
tests/conftest.pyforces Agg for the test session.MPLBACKEND: Agg.MPLBACKEND=Agg(andENV MPLBACKEND=Aggfor Docker) foranyone who wants a guaranteed non-interactive backend.
I went slightly further than the suggested "move it into
utils.plot", sincethat would still flip the backend globally on every plot call. Nothing in the
library touches the global backend now.
Regression guard
tests/test_backend.pyimports entroscope in a subprocess under a non-Aggbackend and asserts it stays put (a subprocess is needed because conftest forces
Agg session-wide). This locks the fix in.
Verification
147 passed, coverage 98.74%, ruff check + format clean. Confirmed the reported
scenario:
MPLBACKEND=template ... import shannonleaves the backend astemplate, notagg.