Ошибка при импорте matplotlib.pyplot(на Anaconda3 для Windows 10 Home 64-bit PC)
Недавно я установил "Anaconda3 для Windows v2.4.0" на мою машину Windows 10 Home (64-разрядная версия).
(Я загрузил 64-разрядный графический инсталлятор Windows "Anaconda3-2.4.0-Windows-x86_64.exe" (392 МБ) из https://www.continuum.io/downloads.)
В окне командной строки я сделал "тестовый диск" конды, включая "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
Установка, кажется, была успешной - например:
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
>>>
Обратите внимание, что 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
>>>
Я открыл "C:\Anaconda3\lib\site-packages\matplotlib\font_manager.py" в текстовом редакторе и попытался найти источник ошибки. Я думаю, что здесь все происходит неправильно:
>>> mpl.get_cachedir()
'C:\\Users\\Anshul\\.matplotlib'
>>> mpl.get_configdir()
'C:\\Users\\Anshul\\.matplotlib'
>>>
В проводнике Windows я вижу, что папка "C:\Users\Anshul.matplotlib" пуста, поэтому FileNotFoundError
для файла "fontList.py3k.cache" (который я не вижу нигде в "C:\Anaconda3" ). Кажется, проблема с установщиком (я думаю), но я не знаю, как это исправить. Я был бы признателен за любую помощь или указатели.
(BTW, я уже пробовал эту проблему). Тот, который был ближе всего, был возвращен в 2013 году: не удалось импортировать matplotlib.pyplot # 2320. включала установку WinPython-64bit-3.3.2.2 на 64-разрядной машине Windows 7. Поток был закрыт комментарием: "Закрытие. Уже исправлено в master.", но похоже, что проблема всплыла. Надеюсь, что есть простое исправление или обходное решение.)
Спасибо,
Anshul
Ответы
Ответ 1
Это ошибка в 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]
Ответ 2
Я использую Python 3.5.2. Когда я попробовал решение @simonzack, у меня все еще была ошибка. Я сузил исключение в файл <python>/Lib/ntpath.py
. Найдите определение функции abspath()
вокруг строки 530.
Я добавил решение @simonzack для обработчика исключений ValueError. Вставьте следующий код после строки 537:
530: def abspath(path):
531: """Return the absolute version of a path."""
533: if path: # Empty path must return current working directory.
534: try:
535: path = _getfullpathname(path)
536: except OSError:
537: pass # Bad path - return unchanged.
NEW: except ValueError:
NEW: path = path.split('\0', 1)[0]
NEW: path = _getfullpathname(path)
538: elif isinstance(path, bytes):
539: path = os.getcwdb()
540: else:
541: path = os.getcwd()
542: return normpath(path)
Это исправило ошибку для меня.
Для небольшой истории о причине этой проблемы взгляните на: Python Issue 25778. Это немного длиннее, но окончательный вывод заключается в том, что исправление не попало в 2.7.14, 3.5.3 или 3.6.0. Таким образом, похоже, этот хак будет нашим единственным решением для более старых версий Python.