Skip to content

Confusing error message when home config directory not writable #18011

Closed

Description

@trampgeek

Bug report

Bug summary

If matplotlib is run in an environment without a writable home directory, a very confusing error message is printed in which the configdir and the tempdir are interchanged.

Code for reproduction

  1. In Linux, create a user someone with no home directory.

  2. Run Python with a command like

    sudo -u someone python3

  3. In the Python shell, type import matplotlib

Actual outcome

Matplotlib created a temporary config/cache directory at /root/.config/matplotlib because the default path (/tmp/matplotlib-9yoi7m8l) is not a writable directory; it is highly recommended to set the MPLCONFIGDIR environment variable to a writable directory, in particular to speed up the import of Matplotlib and to better support multiprocessing.

Expected outcome

Matplotlib created a temporary config/cache directory at /tmp/matplotlib-9yoi7m8l because the default path (/root/.config/matplotlib) is not a writable directory; it is highly recommended to set the MPLCONFIGDIR environment variable to a writable directory, in particular to speed up the import of Matplotlib and to better support multiprocessing.

Matplotlib version

  • Operating system: Ubuntu 18.04
  • Matplotlib version: 3.3.0
  • Matplotlib backend (print(matplotlib.get_backend())): agg
  • Python version: 3.9.0b4
  • Jupyter version (if applicable): N/A
  • Other libraries: N/A

Matplotlib was compiled from source. The error is at line 482 in __init__.py at the root level in the source tree. The parameters are the wrong way round.

Activity

  1. added a commit that references this issue on Jul 22, 2020
    6a5e007
  2. added this to the v3.3.1 milestone on Jul 22, 2020
  3. YuantianGao commented on Jul 6, 2021

    @YuantianGao

    I have the same issue, did you solve it?

  4. tacaswell commented on Jul 6, 2021

    @tacaswell
    Member

    @YuantianGao Yes, we fixed the order of the paths in #18014 and this should be fixed in all versions after 3.3.1.

  5. ttarabula commented on Sep 23, 2021

    @ttarabula

    Does anyone know if this warning message can be suppressed? If not, any chance there's interest in adding an environment variable to optionally suppress the warning?

    something like (but better named ;):

    index 71afd3928d..01f8d15fab 100644
    --- a/lib/matplotlib/__init__.py
    +++ b/lib/matplotlib/__init__.py
    @@ -481,13 +481,14 @@ def _get_config_or_cache_dir(xdg_base_getter):
         tmpdir = os.environ["MPLCONFIGDIR"] = \
             tempfile.mkdtemp(prefix="matplotlib-")
         atexit.register(shutil.rmtree, tmpdir)
    -    _log.warning(
    -        "Matplotlib created a temporary config/cache directory at %s because "
    -        "the default path (%s) is not a writable directory; it is highly "
    -        "recommended to set the MPLCONFIGDIR environment variable to a "
    -        "writable directory, in particular to speed up the import of "
    -        "Matplotlib and to better support multiprocessing.",
    -        tmpdir, configdir)
    +    if not os.environ.get("MPLNOCACHEWARN"):
    +        _log.warning(
    +            "Matplotlib created a temporary config/cache directory at %s because "
    +            "the default path (%s) is not a writable directory; it is highly "
    +            "recommended to set the MPLCONFIGDIR environment variable to a "
    +            "writable directory, in particular to speed up the import of "
    +            "Matplotlib and to better support multiprocessing.",
    +            tmpdir, configdir)

    Or, perhaps switch to using the warnings module for the message, and give it a category, then allow people to suppress it via warnings.filterwarnings(category).

  6. jklymak commented on Sep 23, 2021

    @jklymak
    Member

    You can filter logging module warnings as well: https://docs.python.org/3/library/logging.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions