2015-11-30 16 views
16

Recentemente ho installato "Anaconda3 per Windows v2.4.0" sulla mia macchina Windows 10 Home (64 bit).Errore nell'importazione di matplotlib.pyplot (su Anaconda3 per Windows 10 Home 64-bit PC)

(Ho scaricato il Windows a 64 bit Installatore grafico "Anaconda3-2.4.0-Windows-x86_64.exe" (392 MB) da https://www.continuum.io/downloads.)

In una finestra del prompt dei comandi, ho fatto la Conda " test drive", tra cui "aggiornamento Conda Conda", ecc alla fine, vedo il seguente:

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 

l'installazione sembra aver avuto successo - per esempio:

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 
>>> 

Nota esimo a matplotlib è stato importato bene sopra. Tuttavia, ottengo un messaggio di errore quando si tenta di importare "matplotlib.pyplot" come illustrato di seguito:

>>> 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 
>>> 

ho aperto "C: \ Anaconda3 \ lib \ site-packages \ matplotlib \ font_manager.py" in un editor di testo e ho provato a cercare la fonte dell'errore. Penso che questo è dove le cose vanno male:

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

In Esplora risorse, vedo che il "C: \ Users \ Anshul.matplotlib" cartella è vuota, da cui il FileNotFoundError per il "fontList.py3k.cache "file (che non vedo nemmeno nella directory" C: \ Anaconda3 "). Sembra essere un problema con l'installer (credo), ma non so come risolverlo. Apprezzerei qualsiasi aiuto o suggerimento.

(a proposito, ho già provato a cercare su Google questo problema, quello più vicino è stato riportato nel 2013: fail to import matplotlib.pyplot #2320. Ha coinvolto un'installazione di WinPython-64 bit-3.3.2.2 su un computer Windows 7 a 64 bit. thread è stato chiuso con il commento: ". chiusura già fissato in master"., ma sembra che il problema è riemerso spero che ci sia una semplice correzione o una soluzione alternativa)

Grazie,
Anshul

+1

Sto avendo lo stesso problema su Windows 7 e Vanilla Python 3, non credo che i numeri di versione di Windows siano rilevanti. – simonzack

+1

Ho appena eseguito il debug di questo e penso che winreg.EnumValue sia bacato, a volte emette stringhe che non sono limitate alla sua lunghezza. – simonzack

risposta

19

questo. è un bug in python, non matplotlib.

Il problema è che winreg.EnumValue non sta tagliando correttamente i valori di stringa sulla loro lunghezza per qualche motivo, e le stringhe includeranno caratteri null che os.path.abspath non è in grado di elaborare.

La voce di registro in cui ciò si verifica è SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts. Nonostante questo non sia colpa di matplotlib, possiamo comunque applicarlo temporaneamente in modo tale da terminare la stringa in '\0'. In font_manager.py, la linea di patch 310 nella funzione win32InstalledFonts() a:

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

Grazie mille simonzack! La tua patch ha fatto il trucco. Un piccolo dettaglio però: nel mio file 'C: \ Anaconda3 \ lib \ site-packages \ matplotlib \ font_manager.py', il codice precedente appariva a partire dalla riga 226 (lo trovava cercando' winreg.EnumValue'). Solo l'ultima riga 'direc = direc.split ('\ 0', 1) [0]' è diversa. Spero che la gente di Python lo risolva in modo permanente - questo problema sembra essere stato in circolazione per alcuni anni! –

+1

@AnshulAgrawal Nessun problema, puoi accettare la mia risposta se ti aiuta. È sicuramente un problema nei progetti di grandi dimensioni, nessuno sembra assumere bug antichi. – simonzack

+1

Ho segnalato il problema su "Python bug tracker" ed i loro esperti di Windows stanno cercando di eseguirne il debug: http://bugs.python.org/issue25778 Solo FYI –

0

sto usando Python 3.5.2. Quando ho provato la soluzione @simonzack, ho ancora un errore. Ho ristretto l'eccezione al file <python>/Lib/ntpath.py. Cerca la definizione della funzione abspath() intorno alla linea 530.

Ho aggiunto la soluzione di @ simonzack a un gestore di eccezioni ValueError. Inserire il seguente codice dopo la riga 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) 

Quello ha corretto l'errore per me.

Per un po 'di storia sulla causa di questo problema, dare un'occhiata a: Python Issue 25778. È un po 'lungo ma la conclusione finale è che la correzione non è riuscita a farlo in 2.7.14, 3.5.3 o 3.6.0. Quindi sembra che questa modifica sarà la nostra unica soluzione per le versioni precedenti di Python.

Problemi correlati