spyder-ide / spyder

Official repository for Spyder - The Scientific Python Development Environment
https://www.spyder-ide.org
MIT License
8.22k stars 1.59k forks source link

matplotlibrc file in working directory is ignored when running from Spyder #21854

Open schtandard opened 6 months ago

schtandard commented 6 months ago

Issue Report Checklist

Problem Description

A matplotlibrc file in the working directory is ignored when running a script inside Spyder. It works as expected when running from the console (using either python or ipython).

What steps reproduce the problem?

  1. Create the file rcfile.py with the following content:

    import os
    from matplotlib import pyplot as plt
    
    assert 'matplotlibrc' in os.listdir()
    
    # With the following line, the style sheet is used.
    # plt.style.use('matplotlibrc')
    
    fig, ax = plt.subplots()
    fig.savefig('test.png')
  2. In the same directory, create the file matplotlibrc with the following content:

    axes.edgecolor: red
  3. Open rcfile.py in Spyder and run it. It outputs this image:

    test

  4. Run python rcfile.py from the command line. It outputs this image:

    test

I could not find any documentation of this behavior. The resolution of the two images is also different, presumably due to the setting Preferences -> IPython console -> Graphics -> Inline backend -> Resolution, though it is not obvious from the setting that it changes rcParams rather than just controlling how the png displayed in Spyder is created.

Explicitly loading the matplotlibrc configuration does work.

Versions

Dependencies

# Mandatory:
atomicwrites >=1.2.0                             :  1.4.0 (OK)
chardet >=2.0.0                                  :  4.0.0 (OK)
cloudpickle >=0.5.0                              :  2.2.1 (OK)
cookiecutter >=1.6.0                             :  2.5.0 (OK)
diff_match_patch >=20181111                      :  20200713 (OK)
intervaltree >=3.0.2                             :  3.1.0 (OK)
IPython >=7.31.1,<9.0.0,!=8.8.0,!=8.9.0,!=8.10.0 :  8.20.0 (OK)
jedi >=0.17.2,<0.19.0                            :  0.18.1 (OK)
jellyfish >=0.7                                  :  1.0.1 (OK)
jsonschema >=3.2.0                               :  4.19.2 (OK)
keyring >=17.0.0                                 :  23.13.1 (OK)
nbconvert >=4.0                                  :  7.10.0 (OK)
numpydoc >=0.6.0                                 :  1.5.0 (OK)
paramiko >=2.4.0                                 :  2.8.1 (OK)
parso >=0.7.0,<0.9.0                             :  0.8.3 (OK)
pexpect >=4.4.0                                  :  4.8.0 (OK)
pickleshare >=0.4                                :  0.7.5 (OK)
psutil >=5.3                                     :  5.9.0 (OK)
pygments >=2.0                                   :  2.15.1 (OK)
pylint >=2.5.0,<3.0                              :  2.16.2 (OK)
pylint_venv >=2.1.1                              :  2.3.0 (OK)
pyls_spyder >=0.4.0                              :  0.4.0 (OK)
pylsp >=1.7.2,<1.8.0                             :  1.7.2 (OK)
pylsp_black >=1.2.0                              :  2.0.0 (OK)
qdarkstyle >=3.0.2,<3.2.0                        :  3.0.2 (OK)
qstylizer >=0.2.2                                :  0.2.2 (OK)
qtawesome >=1.2.1                                :  1.2.2 (OK)
qtconsole >=5.4.2,<5.5.0                         :  5.4.2 (OK)
qtpy >=2.1.0                                     :  2.4.1 (OK)
rtree >=0.9.7                                    :  1.0.1 (OK)
setuptools >=49.6.0                              :  68.2.2 (OK)
sphinx >=0.6.6                                   :  5.0.2 (OK)
spyder_kernels >=2.4.3,<2.5.0                    :  2.4.4 (OK)
textdistance >=4.2.0                             :  4.2.1 (OK)
three_merge >=0.1.1                              :  0.1.1 (OK)
watchdog >=0.10.3                                :  2.1.6 (OK)
zmq >=22.1.0                                     :  25.1.2 (OK)

# Optional:
cython >=0.21                                    :  None (NOK)
matplotlib >=3.0.0                               :  3.8.0 (OK)
numpy >=1.7                                      :  1.26.4 (OK)
pandas >=1.1.1                                   :  None (NOK)
scipy >=0.17.0                                   :  None (NOK)
sympy >=0.7.3                                    :  None (NOK)
dalthviz commented 6 months ago

Hi @schtandard thank you for the feedback! I did a quick test and I was able to reproduce this :+1: Also, maybe a way to workaround this for the moment would be to set the Spyder working directory to the directory where your files are and then restart the Spyder IPython console kernel (using the Restart kernel action). Let us know if the workaround helps!

schtandard commented 6 months ago

Do you mean using Preferences -> Run -> Working directory settings -> The following direcotry? That doesn't seem to work either: Now the assert fails, as Spyder seems to run the script from my user directory (C:\Users\wilde), no matter which directory I set in the preferences. Did this work on your end?

However, even if this worked, it wouldn't be an option for me, as I usually work on several files located in different directories at the same time and need each one to be executed from their own working directory, so setting a fixed one is not an option. For the time being, I will just load the matplotlibrc file manually.

dalthviz commented 6 months ago

I meant to say to use the working directory toolbar, sorry for the confusion there 😅 :

image

What works for me as another workaround is to be sure that the correct working directory is set in the toolbar plus restarting the console kernel (which maybe means that somehow the matplolibrc load is done just once per kernel run 🤔, what do you think about that @ccordoba12 ?):

matplotlibrc

And indeed, seems way easier to just force the matplolibrc load programatically as a workaround :+1:

ccordoba12 commented 6 months ago

which maybe means that somehow the matplolibrc load is done just once per kernel run 🤔, what do you think about that @ccordoba12 ?

Yeah, I'd say that's the right assessment @dalthviz because most probably Matplotlib can be configured through matplotlibrc only once, when it's imported.

However, I'm not sure how to tackle this issue. Perhaps we could detect if there's a matplotlibrc in the current working directory before executing a file and, if that's the case, display a message in the console saying something like:

We detected that you have a matplotlibrc file in your working directory. Please be aware that any changes or additions to it require a kernel restart to take effect.

What do you think?