Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
267 views
in Technique[技术] by (71.8m points)

python 3.x - 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:UsersAnshulDownloadsPython>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:UsersAnshulDownloadsPython>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:UsersAnshulDownloadsPython>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:Anaconda3libsite-packagesmatplotlibfont_manager.py", line 1412, in <module>
    fontManager = pickle_load(_fmcache)
  File "C:Anaconda3libsite-packagesmatplotlibfont_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:Anaconda3libsite-packagesmatplotlibpyplot.py", line 29, in <module>
    import matplotlib.colorbar
  File "C:Anaconda3libsite-packagesmatplotlibcolorbar.py", line 34, in <module>
    import matplotlib.collections as collections
  File "C:Anaconda3libsite-packagesmatplotlibcollections.py", line 27, in <module>
    import matplotlib.backend_bases as backend_bases
  File "C:Anaconda3libsite-packagesmatplotlibackend_bases.py", line 62, in <module>
    import matplotlib.textpath as textpath
  File "C:Anaconda3libsite-packagesmatplotlibextpath.py", line 15, in <module>
    import matplotlib.font_manager as font_manager
  File "C:Anaconda3libsite-packagesmatplotlibfont_manager.py", line 1420, in <module>
    _rebuild()
  File "C:Anaconda3libsite-packagesmatplotlibfont_manager.py", line 1405, in _rebuild
    fontManager = FontManager()
  File "C:Anaconda3libsite-packagesmatplotlibfont_manager.py", line 1043, in __init__
    self.ttffiles = findSystemFonts(paths) + findSystemFonts()
  File "C:Anaconda3libsite-packagesmatplotlibfont_manager.py", line 312, in findSystemFonts
    for f in win32InstalledFonts(fontdir):
  File "C:Anaconda3libsite-packagesmatplotlibfont_manager.py", line 231, in win32InstalledFonts
    direc = os.path.abspath(direc).lower()
  File "C:Anaconda3lib
tpath.py", line 535, in abspath
    path = _getfullpathname(path)
ValueError: _getfullpathname: embedded null character
>>>

I opened "C:Anaconda3libsite-packagesmatplotlibfont_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:UsersAnshul.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

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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 SOFTWAREMicrosoftWindows NTCurrentVersionFonts. Despite this not being matplotlib's fault we can still temporarily patch it so that it ends the string at ''. 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('', 1)[0]

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...