Importerror: Cannot Import Name Cbook
>>> import matplotlib
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/__init__.py", line 123, in <module>
    from . import cbook
ImportError: cannot import name cbook

I didn't find a solution, can anyone help?

2

7 Answers

1. Try to update matplotlib

python -m pip install -U matplotlib

2. Try to reinstall matplotlib

python -m pip uninstall matplotlib
python -m pip install -U matplotlib

What does the following snippet print to the console?

python -c "import matplotlib"
4

I hit this issue today due to a bad dependency.

If you have both backports.shutil_get_terminal_size and backports.functools_lru_cache installed, you can encounter this.

Matplotlib has a brittle workaround for a cyclic import:

# cbook must import matplotlib only within function
# definitions, so it is safe to import from it here.
from . import cbook

Until PR #10483, matplotlib dependended on backports.functools_lru_cache.

However, ipython depends on backports.shutil_get_terminal_size, and that package doesn't set up a namespace package properly.

If you have this problem, you'll see these symptoms:

>>> import backports
<module 'backports.shutil_get_terminal_size' from '/Users/whughes/miniconda2/envs/scratch/lib/python2.7/site-packages/backports/shutil_get_terminal_size/__init__.pyc'>
>>> >import backports.functools_lru_cache
ImportError: No module named functools_lru_cache

The problem with backports.shutil_get_terminal_size is that it doesn't define a namespace package, so it breaks any other backports.foo packages.

Reinstalling matplotlib fixes this because it changes the order in sys.path, putting backports.functools_lru_cache first, and that package defines a proper namespace.

You can also fix this by reinstalling backports.shutil_get_terminal_size.

2

I solve the problem uninstalling matplotpli and reinstalling without pip:

$ sudo apt-get install python-matplotlib

Thanks to this README.html.

1

My experience is to be careful about the version of matplotlib. Today the latest version is 3.3 and has this issue. So I specify the previous version that worked for me:

pip install matplotlib==3.2.2
1

just sharing my experience, I was trying to run Python code (2.7) making use of matplotlib. The code is running inside a docker container based on a Debian 10 image.

In the end I based the solution on the answers here, but there was a small caveat. I had to do the actions in the following order:

  1. Install the rest of the requirements
  2. Install matplotlib (no need to specify a version in my case, 2.2.5 was installed by pip)
  3. Install arrow
  4. Uninstall backports.functools_lru_cache
  5. Install backports.functools_lru_cache version 1.2.1

The code on the dockerfile is as it follows:

RUN pip2 install -r requirements.txt
RUN pip2 install matplotlib
RUN pip2 install arrow
RUN pip2 uninstall -y backports.functools_lru_cache
RUN pip2 install backports.functools_lru_cache==1.2.1

You can find the whole project on github:

Go to /usr/local/lib/python2.7/dist-packages/matplotlib and delete __init__.py if there are more than one of those files, delete all of them... It will work. For your confidence save them somewhere else first :) see your error message, the directory is shown, the file is the init constructor written there

working...

pip install --user matplotlib==2.0.2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

David Miller

David Miller

Executive Financial & Market Analyst

David Miller brings 15 years of experience in global economics, personal finance strategy, and market dynamics. He specializes in turning complex economic trends into actionable insights for everyday readers.

Share this article
Twitter Facebook Pinterest