导入matplotlib.pyplot时出错(在适用于Windows 10 Home 64位PC的Anaconda3上)

Ans*_*wal 18 windows matplotlib python-3.x

我最近在我的Windows 10 Home(64位)机器上安装了"Anaconda3 for Windows v2.4.0".

(我从https://www.continuum.io/downloads下载了Windows 64位图形安装程序"Anaconda3-2.4.0-Windows-x86_64.exe"(392 MB).)

在命令提示符窗口中,我做了conda"Test Drive",包括"conda update conda"等.最后,我看到以下内容:

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
Run Code Online (Sandbox Code Playgroud)

安装似乎已经成功 - 例如:

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
>>> 
Run Code Online (Sandbox Code Playgroud)

请注意,matplotlib是在上面导入的.但是,当我尝试导入"matplotlib.pyplot"时,我收到一条错误消息,如下所示:

>>> 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
>>>
Run Code Online (Sandbox Code Playgroud)

我在文本编辑器中打开了"C:\ Anaconda3\lib\site-packages\matplotlib\font_manager.py",并试图查找错误的来源.我认为这是出错的地方:

>>> mpl.get_cachedir()
'C:\\Users\\Anshul\\.matplotlib'
>>> mpl.get_configdir()
'C:\\Users\\Anshul\\.matplotlib'
>>>
Run Code Online (Sandbox Code Playgroud)

在Windows资源管理器中,我看到"C:\ Users\Anshul.matplotlib"文件夹为空,因此FileNotFoundError为"fontList.py3k.cache"文件(我在"C:\ Anaconda3"中看不到任何地方)目录或).它似乎是安装程序的一个问题(我认为),但我不知道如何解决它.我很感激任何帮助或指点.

(顺便说一句,我已经尝试过谷歌搜索这个问题.最接近的一个是在2013年报道的:未能导入matplotlib.pyplot#2320.它涉及在Windows 7 64位上安装WinPython-64bit-3.3.2.2线程已关闭,注释:"关闭.已经在主服务器中修复了.",但似乎问题已经重新出现.我希望有一个简单的修复或解决方法.)

谢谢,
安舒尔

sim*_*ack 21

这是python中的一个错误,而不是matplotlib.

问题是winreg.EnumValue由于某种原因,不能正确地剪切字符串值,字符串将包含os.path.abspath无法处理的空字符.

发生这种情况的注册表项位于SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts.尽管这不是matplotlib的错,我们仍然可以暂时修补它,以便它结束字符串'\0'.在font_manager.py,补丁线310中的win32InstalledFonts()功能是:

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]
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢simonzack!你的补丁搞砸了.但是有一个小细节:在我的`C:\ Anaconda3\lib\site-packages\matplotlib\font_manager.py`文件中,上面的代码出现在第226行(通过搜索`winreg.EnumValue`找到它).只有最后一行`direc = direc.split('\ 0',1)[0]`是不同的.希望python人员能够永久修复这个问题 - 这个问题似乎已经存在了几年! (3认同)
  • @simonzack你可以成为你希望看到的变化,并通过该补丁对抗mpl进行公关吗? (2认同)