2016-08-10 37 views
2

因此,我花了我一段时间才确定了这一问题的原因,但仍然无法解决问题。我最近切换到python3和我尝试导入matplotlib当这个巨大的错误:为什么我从源文件中获取非有效unicode(但仅在导入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: – 

要修正只是删除 “EN DASH”(或整个线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

在pyparsing中查看此代码时,当尝试查看是否会在调用者代码或pyparsing代码中引发潜在异常时,会出现此问题。我已在早上检查了SVN中提出的修复方案,以限制调用堆栈的级别pyparsing在做出这个决定时检索 - 请下载并尝试。 (当然,我正在更新我的单元测试,但不知道我能否重现这个特定的错误情况。) – PaulMcG

+0

pyparsing 2.1.8只是推到PyPI上 - 请执行'pip install -U pyparsing'来获取最新版本,并且重试你的脚本。 – PaulMcG

+1

@PaulMcGuire刚做了一个比较直接的比较,我可以确认该更新修复了我的问题。谢谢! – Zak

回答

1

的问题是在pyparsing时导致一个错误:

与传统的lex/yacc方法或使用正则表达式相比,pyparsing模块是创建和执行简单文法的替代方法。通过pyparsing,您不需要学习定义语法或匹配表达式的新语法 - 解析模块提供了一个用于直接在Python中构造语法的类库。

为了“直接在Python中构建语法”,pyparsing需要读取定义语法的源文件(本例中为matplotlib源文件)。在通常只是一些无害的额外工作的情况下,pyparsing不仅读取matplotlib源文件,而且还读取定义语法时栈中的所有内容,一直到源文件,其中包含您的文件import matplotlib。当它到达源文件时,它会扼杀,因为你的文件确实不是UTF-8; 0x96是en-dash的Windows-1252(和/或Latin-1)编码。这个问题(阅读太多的堆栈)有already been fixedthe author of pyparsing所以修复应该在下一个release of pyparsing(可能是2.1.8)。

顺便说一下,matplotlib正在定义一个pyparsing语法,以便能够读取fontconfig文件,这是一种配置主要用于Linux的字体的方法。所以在Windows上pyparsing可能甚至不需要使用matplotlib!

+1

“懒惰”可能有点评判 - 在pyparsing的这个地方,我实际上跳过一些额外的箍环,试图最小化调用者代码所需的工作。我希望通过增加'limit = n'参数来调用'extract_stack'和'extract_tb',我可以缓解这个问题。(根本问题是,在调用用户回调函数时,pyparsing可能会在内部引发TypeError异常,并且异常本身无法与用户回调代码中可能引发的TypeError区分 - 因此需要检查调用堆栈。) – PaulMcG

+0

@PaulMcGuire对不起,这确实不符合我的要求。感谢您使用pyparsing并快速修复此问题。 – ecatmur

+0

谢谢,没有难过的感觉。至于matplotlib使用pyparsing,我知道至少在同一时间,在mathtext模块中使用了pyparsing,但我不能说这是否仍然如此。 – PaulMcG

相关问题