Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error on import matplotlib.pyplot (on Anaconda3 for Windows 10 Home 64-bit PC)

I recently installed "Anaconda3 for Windows v2.4.0" on my Windows 10 Home (64 bit) machine.

(I downloaded the Windows 64-bit Graphical Installer "Anaconda3-2.4.0-Windows-x86_64.exe" (392 MB) from https://www.continuum.io/downloads.)

In a Command Prompt window, I did the conda "Test Drive", including "conda update conda", etc. In the end, I see the following:

C:\Users\Anshul\Downloads\Python>conda update conda
Fetching package metadata: ....
# All requested packages already installed.
# packages in environment at C:\Anaconda3:
#
conda                     3.18.6                   py35_0    defaults

C:\Users\Anshul\Downloads\Python>conda list matplotlib
# packages in environment at C:\Anaconda3:
#
matplotlib                1.5.0               np110py35_0    defaults

The installation seems to have been successful - for example:

C:\Users\Anshul\Downloads\Python>python
Python 3.5.0 |Anaconda 2.4.0 (64-bit)| (default, Nov  7 2015, 13:15:24) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello World")
Hello World
>>> import os
>>> os.getcwd()
'C:\\Users\\Anshul\\Downloads\\Python'
>>> import matplotlib as mpl
>>> print(mpl.__version__)
1.5.0
>>> 

Note that matplotlib was imported fine above. However, I get an error message when I try to import "matplotlib.pyplot" as shown below:

>>> import matplotlib.pyplot as pp
Traceback (most recent call last):
  File "C:\Anaconda3\lib\site-packages\matplotlib\font_manager.py", line 1412, in <module>
    fontManager = pickle_load(_fmcache)
  File "C:\Anaconda3\lib\site-packages\matplotlib\font_manager.py", line 963, in pickle_load
    with open(filename, 'rb') as fh:
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Anshul\\.matplotlib\\fontList.py3k.cache'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Anaconda3\lib\site-packages\matplotlib\pyplot.py", line 29, in <module>
    import matplotlib.colorbar
  File "C:\Anaconda3\lib\site-packages\matplotlib\colorbar.py", line 34, in <module>
    import matplotlib.collections as collections
  File "C:\Anaconda3\lib\site-packages\matplotlib\collections.py", line 27, in <module>
    import matplotlib.backend_bases as backend_bases
  File "C:\Anaconda3\lib\site-packages\matplotlib\backend_bases.py", line 62, in <module>
    import matplotlib.textpath as textpath
  File "C:\Anaconda3\lib\site-packages\matplotlib\textpath.py", line 15, in <module>
    import matplotlib.font_manager as font_manager
  File "C:\Anaconda3\lib\site-packages\matplotlib\font_manager.py", line 1420, in <module>
    _rebuild()
  File "C:\Anaconda3\lib\site-packages\matplotlib\font_manager.py", line 1405, in _rebuild
    fontManager = FontManager()
  File "C:\Anaconda3\lib\site-packages\matplotlib\font_manager.py", line 1043, in __init__
    self.ttffiles = findSystemFonts(paths) + findSystemFonts()
  File "C:\Anaconda3\lib\site-packages\matplotlib\font_manager.py", line 312, in findSystemFonts
    for f in win32InstalledFonts(fontdir):
  File "C:\Anaconda3\lib\site-packages\matplotlib\font_manager.py", line 231, in win32InstalledFonts
    direc = os.path.abspath(direc).lower()
  File "C:\Anaconda3\lib\ntpath.py", line 535, in abspath
    path = _getfullpathname(path)
ValueError: _getfullpathname: embedded null character
>>>

I opened "C:\Anaconda3\lib\site-packages\matplotlib\font_manager.py" in a text editor and tried to look for the source of the error. I think this is where things are going wrong:

>>> mpl.get_cachedir()
'C:\\Users\\Anshul\\.matplotlib'
>>> mpl.get_configdir()
'C:\\Users\\Anshul\\.matplotlib'
>>>

In Windows Explorer, I see that the "C:\Users\Anshul.matplotlib" folder is empty, hence the FileNotFoundError for the "fontList.py3k.cache" file (which I don't see anywhere in the "C:\Anaconda3" directory either). It seems to be a problem with the installer (I think), but I don't know how to fix it. I'd appreciate any help or pointers.

(BTW, I've already tried googling this issue. The one that came closest was reported back in 2013: fail to import matplotlib.pyplot #2320. It involved a WinPython-64bit-3.3.2.2 installation on a Windows 7 64-bit machine. The thread was closed with the comment: "Closing. Already fixed in master.", but it appears the issue has resurfaced. I hope there is a simple fix or workaround.)

Thanks,
Anshul

like image 749
Anshul Agrawal Avatar asked Nov 30 '15 17:11

Anshul Agrawal


People also ask

Why is matplotlib not importing?

The error is caused because of the following reasons, check them out: Make sure that the version of matplotlib you are installing is compaitible with your python version installed. If the python installed is 64 bits version with matplotlib is 32bits. Make sure they are the same.

Does Python 3.7 support matplotlib?

Matplotlib is a python library that allows you to represent your data visually. It's particularly useful for data science and machine learning developers. Matplotlib is the most visualization package for Python.


Video Answer


1 Answers

This is a bug in python, not matplotlib.

The issue is that winreg.EnumValue is not cutting string values at their length properly for some reason, and strings will include null characters which os.path.abspath is not able to process.

The registry entry where this happens is at SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts. Despite this not being matplotlib's fault we can still temporarily patch it so that it ends the string at '\0'. In font_manager.py, patch line 310 in the win32InstalledFonts() function to:

key, direc, any = winreg.EnumValue( local, j)
if not is_string_like(direc):
    continue
if not os.path.dirname(direc):
    direc = os.path.join(directory, direc)
direc = direc.split('\0', 1)[0]
like image 66
simonzack Avatar answered Sep 21 '22 11:09

simonzack