所以我花了一段时间才确定了这个问题的原因,但仍然处于失败状态。我最近切换到python3,在尝试导入matplotlib时出现了这个巨大的错误:
Traceback (most recent call last):
File "C:/Users/y2kbugger/Desktop/test.py", line 6, in <module>
File "C:\Anaconda2\envs\mypackage\lib\site-packages\matplotlib\__init__.py", lin
e 124, in <module>
from matplotlib.rcsetup import (defaultParams,
File "C:\Anaconda2\envs\mypackage\lib\site-packages\matplotlib\rcsetup.py", line
30, in <module>
from matplotlib.fontconfig_pattern import parse_fontconfig_pattern
File "C:\Anaconda2\envs\mypackage\lib\site-packages\matplotlib\fontconfig_patter
n.py", line 25, in <module>
from pyparsing import Literal, ZeroOrMore, \
File "C:\Anaconda2\envs\mypackage\lib\site-packages\pyparsing.py", line 3539, in
<module>
_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(la
mbda s,l,t:t[0][1])
File "C:\Anaconda2\envs\mypackage\lib\site-packages\pyparsing.py", line 966, in
setParseAction
self.parseAction = list(map(_trim_arity, list(fns)))
File "C:\Anaconda2\envs\mypackage\lib\site-packages\pyparsing.py", line 813, in
_trim_arity
this_line = extract_stack()[-1]
File "C:\Anaconda2\envs\mypackage\lib\site-packages\pyparsing.py", line 797, in
extract_stack
frame_summary = traceback.extract_stack()[offset]
File "C:\Anaconda2\envs\mypackage\lib\traceback.py", line 207, in extract_stack
stack = StackSummary.extract(walk_stack(f), limit=limit)
File "C:\Anaconda2\envs\mypackage\lib\traceback.py", line 358, in extract
f.line
File "C:\Anaconda2\envs\mypackage\lib\traceback.py", line 282, in line
self._line = linecache.getline(self.filename, self.lineno).strip()
File "C:\Anaconda2\envs\mypackage\lib\linecache.py", line 16, in getline
lines = getlines(filename, module_globals)
File "C:\Anaconda2\envs\mypackage\lib\linecache.py", line 47, in getlines
return updatecache(filename, module_globals)
File "C:\Anaconda2\envs\mypackage\lib\linecache.py", line 137, in updatecache
lines = fp.readlines()
File "C:\Anaconda2\envs\mypackage\lib\codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 308: invali
d start byte
注释掉import matplotlib as mpl
会导致错误不会发生。这让我误入歧途尝试不同的matplot,numpy等组合。困惑我的部分是,如果我删除了评论(我从网上粘贴),错误实际上是固定的。我的编辑是vim。我想utf-8不是vim用于编写文件的编码。
产生最小错误的例子:
# -*- coding: utf-8 -*-
import matplotlib as mpl
# Bad character pasted into vim from chrome: –
要修复,只需删除&#34; EN DASH&#34; (或整行3)和matplotlib正确导入。
那么为什么注释中的无效(?)unicode仅在尝试import matplotlib
时(在它到达相关评论之前)导致错误
python==3.5.2
colorama==0.3.7
comtypes==1.1.2
cycler==0.10.0
matplotlib==1.5.1
numpy==1.11.1
pandas==0.18.1
py==1.4.31
pyparsing==2.1.4
pytest==2.9.2
python-dateutil==2.5.3
pytz==2016.6.1
pywin32==220
scikit-learn==0.17.1
scipy==0.18.0
six==1.10.0
答案 0 :(得分:1)
问题出在pyparsing:
与传统的lex / yacc方法或正则表达式的使用相比,pyparsing模块是创建和执行简单语法的另一种方法。通过pyparsing,您不需要学习用于定义语法或匹配表达式的新语法 - 解析模块提供了一个类库,您可以使用它直接在Python中构造语法。
为了直接在Python&#34;中构造语法,pyparsing需要读取定义语法的源文件(在本例中为matplotlib源文件)。在通常只是一些无害的额外工作中,pyparsing不只是读取matplotlib源文件,而是读取堆栈中语法定义点的所有内容,一直到源文件,在那里你有{{1 }}。当它到达你的源文件时它会窒息,因为你的文件确实不是UTF-8; 0x96是用于短划线的Windows-1252(和/或Latin-1)编码。这个问题(读取过多的堆栈)already been fixed the author of pyparsing release of pyparsing,因此修复应该在下一个{{3}}(可能是2.1.8)。
顺便说一下,matplotlib正在定义一个pyparsing语法,以便能够读取fontconfig文件,这是一种配置主要在Linux上使用的字体的方法。所以在Windows上,pyparsing可能甚至不需要使用matplotlib!