2015-11-30 26 views
16

Gần đây tôi đã cài đặt "Anaconda3 cho Windows v2.4.0" trên máy Windows 10 Home (64 bit) của mình.Lỗi khi nhập khẩu matplotlib.pyplot (trên Anaconda3 cho Windows 10 Home 64-bit PC)

(Tôi đã tải về Windows 64-bit cài đặt đồ họa "Anaconda3-2.4.0-Windows-x86_64.exe" (392 MB) từ https://www.continuum.io/downloads.)

Trong cửa sổ Command Prompt, tôi đã làm conda " test Drive", bao gồm "conda cập nhật conda", vv cuối cùng, tôi thấy như sau:

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 

việc lắp đặt dường như đã thành công - ví dụ:

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

Lưu ý thứ tại matplotlib đã được nhập tốt hơn ở trên. Tuy nhiên, tôi nhận được một thông báo lỗi khi tôi cố gắng nhập "matplotlib.pyplot" như hình dưới đây:

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

Tôi mở "C: \ Anaconda3 \ lib \ site-packages \ matplotlib \ font_manager.py" trong một trình soạn thảo văn bản và cố gắng tìm nguồn gốc của lỗi. Tôi nghĩ rằng đây là nơi mà mọi thứ đang đi sai:

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

Trong Windows Explorer, tôi thấy rằng "C: \ Users \ Anshul.matplotlib" thư mục rỗng, vì thế mà FileNotFoundError cho "fontList.py3k.cache "tập tin (mà tôi không thấy bất cứ nơi nào trong thư mục" C: \ Anaconda3 "). Nó có vẻ là một vấn đề với trình cài đặt (tôi nghĩ), nhưng tôi không biết làm thế nào để sửa chữa nó. Tôi đánh giá cao bất kỳ trợ giúp hoặc con trỏ.

(BTW, tôi đã cố gắng googling vấn đề này. Một trong đó đến gần nhất đã được báo cáo trở lại trong 2013: fail to import matplotlib.pyplot #2320. Nó liên quan đến một cài đặt WinPython-64bit-3.3.2.2 trên một máy tính Windows 7 64-bit. chủ đề đã đóng cửa với lời nhận xét: ". đóng đã cố định trong tổng thể"., nhưng dường như vấn đề này đã xuất hiện trở lại tôi hy vọng có một sửa chữa đơn giản hay workaround)

Cảm ơn,
Anshul

+1

Tôi đang gặp vấn đề tương tự trên windows 7 và vanilla python 3, tôi không nghĩ số phiên bản cửa sổ có liên quan. – simonzack

+1

Chỉ cần gỡ lỗi này và tôi nghĩ rằng winreg.EnumValue là lỗi, đôi khi nó kết quả đầu ra các chuỗi không bị giới hạn về độ dài của nó. – simonzack

Trả lời

19

này. là một lỗi trong python, không phải matplotlib.

Vấn đề là winreg.EnumValue không cắt các giá trị chuỗi theo chiều dài của chúng phù hợp vì một số lý do và chuỗi sẽ bao gồm các ký tự rỗng mà os.path.abspath không thể xử lý.

Mục đăng ký tại nơi điều này xảy ra là SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts. Mặc dù đây không phải là lỗi của matplotlib, chúng tôi vẫn có thể tạm thời vá lỗi để nó kết thúc chuỗi tại '\0'. Trong font_manager.py, vá dòng 310 trong hàm 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

Cảm ơn bạn rất nhiều simonzack! Miếng vá của bạn đã làm các trick. Một chi tiết nhỏ mặc dù: trong tệp 'C: \ Anaconda3 \ lib \ site-packages \ matplotlib \ font_manager.py' của tôi, đoạn mã trên xuất hiện bắt đầu từ dòng 226 (tìm thấy nó bằng cách tìm kiếm' winreg.EnumValue'). Chỉ dòng cuối cùng 'direc = direc.split ('\ 0', 1) [0]' khác nhau. Hy vọng các folks python làm cho một sửa chữa vĩnh viễn - vấn đề này dường như đã được khoảng một vài năm! –

+1

@AnshulAgrawal Không phải lo lắng, bạn có thể chấp nhận câu trả lời của tôi nếu nó giúp. Nó chắc chắn là một vấn đề trong các dự án lớn, không ai dường như có những lỗi cổ xưa. – simonzack

+1

Tôi đã báo cáo sự cố về "Trình theo dõi lỗi Python" và các chuyên gia Windows của họ đang cố gắng gỡ lỗi: http://bugs.python.org/issue25778 Chỉ cần FYI –

0

Tôi đang sử dụng Python 3.5.2. Khi tôi đã thử giải pháp @simonzack, tôi vẫn gặp lỗi. Tôi thu hẹp ngoại lệ xuống tệp <python>/Lib/ntpath.py. Hãy tìm định nghĩa của hàm abspath() xung quanh dòng 530.

Tôi đã thêm giải pháp @ simonzack vào trình xử lý ngoại lệ ValueError. Chèn mã sau đây sau dòng 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) 

Điều đó đã khắc phục lỗi cho tôi.

Để có một ít lịch sử về nguyên nhân của vấn đề này, hãy xem: Python Issue 25778. Đó là một chút dài nhưng kết luận cuối cùng là sửa chữa đã không làm cho nó vào 2.7.14, 3.5.3 hoặc 3.6.0. Vì vậy, nó xuất hiện hack này sẽ là giải pháp duy nhất của chúng tôi cho các phiên bản cũ của Python.

Các vấn đề liên quan