2015-11-30 63 views
16

我最近在Windows 10 Home(64位)機器上安裝了「Anaconda3 for Windows v2.4.0」。導入matplotlib.pyplot時出錯(在Windows 10 Home 64位PC的Anaconda3上)

(我下載的是Windows 64位圖形安裝程序 「Anaconda3-2.4.0-Windows的x86_64.exe」 從https://www.continuum.io/downloads(392 MB)。)

在命令提示符窗口中,我做了暢達「試駕」,其中包括‘暢達更新暢達’,等等。最後,我看到以下內容:

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 \站點包\ matplotlib \ font_manager.py」在文本編輯器,並試圖尋找錯誤的來源。我想,這就是事情會出錯:

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

在Windows資源管理器,我看到了「C:\用戶\ Anshul.matplotlib」文件夾爲空,因此FileNotFoundError爲「fontList.py3k.cache 「文件(我沒有看到」C:\ Anaconda3「目錄中的任何地方)。這似乎是安裝程序的問題(我認爲),但我不知道如何解決它。我會很感激任何幫助或指針。我在這個問題上已經嘗試過使用google搜索,最近發佈的是2013年的報告:fail to import matplotlib.pyplot #2320,它涉及到Windows 7 64位機器上WinPython-64bit-3.3.2.2的安裝。線程關閉與評論:「關閉已經固定在主」,但現在看來這個問題已經復出了,我希望有一個簡單的解決或解決方法)

感謝,
Anshul

+1

我在Windows 7和香草python 3有同樣的問題,我不認爲Windows版本號是相關的。 – simonzack

+1

只是調試了這一點,我認爲winreg.EnumValue是越野車,它有時會輸出沒有上限的字符串。 – simonzack

回答

19

此。是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] 
+3

非常感謝simonzack!你的補丁做到了訣竅。一個小細節:在我的'C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ font_manager.py'文件中,上面的代碼出現在第226行(通過搜索'winreg.EnumValue'找到它)。只有最後一行'direc = direc.split('\ 0',1)[0]'是不同的。希望蟒蛇們能夠永久解決這個問題 - 這個問題似乎已經存在了幾年! –

+1

@AnshulAgrawal不用擔心,如果有幫助,你可以接受我的答案。這在大型項目中肯定是一個問題,似乎沒有人能夠接受古老的錯誤。 – simonzack

+1

我報告了「Python bug跟蹤器」的問題,他們的Windows專家正在嘗試調試它:http://bugs.python.org/issue25778 只是FYI –

0

我使用Python 3.5.2。當我嘗試@simonzack解決方案時,我仍然遇到錯誤。我縮小了<python>/Lib/ntpath.py文件的例外。尋找圍繞530行的abspath()函數的定義。

我將@ 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的唯一解決方案。

相關問題