为什么我在源代码中使用无效的unicode时出现此错误(但仅在导入matplotlib时)

时间:2016-08-10 22:27:35

标签: python-3.x pyparsing

所以我花了一段时间才确定了这个问题的原因,但仍然处于失败状态。我最近切换到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

1 个答案:

答案 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!