OS X 上的 Matplotlib 问题 ( "ImportError: cannot import name _thread" )



在过去的几天里,Matplotlib停止了在OS X上为我工作。这是我尝试import matplotlib时遇到的错误:

Traceback (most recent call last):
  File "/my/path/to/script/my_script.py", line 15, in <module>
    import matplotlib.pyplot as plt
  File "/Library/Python/2.7/site-packages/matplotlib/pyplot.py", line 34, in <module>
    from matplotlib.figure import Figure, figaspect
  File "/Library/Python/2.7/site-packages/matplotlib/figure.py", line 40, in <module>
    from matplotlib.axes import Axes, SubplotBase, subplot_class_factory
  File "/Library/Python/2.7/site-packages/matplotlib/axes/__init__.py", line 4, in <module>
    from ._subplots import *
  File "/Library/Python/2.7/site-packages/matplotlib/axes/_subplots.py", line 10, in <module>
    from matplotlib.axes._axes import Axes
  File "/Library/Python/2.7/site-packages/matplotlib/axes/_axes.py", line 22, in <module>
    import matplotlib.dates as _  # <-registers a date unit converter
  File "/Library/Python/2.7/site-packages/matplotlib/dates.py", line 126, in <module>
    from dateutil.rrule import (rrule, MO, TU, WE, TH, FR, SA, SU, YEARLY,
  File "/Library/Python/2.7/site-packages/dateutil/rrule.py", line 14, in <module>
    from six.moves import _thread
ImportError: cannot import name _thread

我能想到的唯一系统更改是Apple强制的NTP更新,也许我在/usr/local中进行了一些权限更改以使Brew再次运行。

我尝试通过Pip重新安装Matplotlib和Python-dateutil,但这没有帮助。 还尝试重新启动。 我正在运行Python 2.7.6,它位于/usr/bin/python中。 我正在运行优胜美地(OS X 10.10.1)。

sudo pip uninstall python-dateutil
sudo pip install python-dateutil==2.2

今天下午我也有同样的错误消息,尽管我最近确实升级到优胜美地。我不完全确定我理解为什么将 dateutil 恢复到以前的版本对我有用,但自从运行上述内容以来,我没有遇到任何问题(我通常在 ipython 笔记本中使用内联 pyplot)。

此问题

已在最新的sixdateutil版本中修复。但是,在 OS X 中,即使您将six更新到最新版本,您实际上也可能无法正确更新它。这就是发生在我身上的事情:

做了一个pip2 install six -U后,新的six模块安装在/Library/Python/2.7/site-packages/。但是,当我在python 2.7终端中加载six并检查其路径时,这就是我得到的:

import six
print six.__file__
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.pyc

所以,python使用的是旧版本的six,我通过键入以下内容将其删除:

rm -rf /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.*

这为我解决了这个问题。

安装python-dateutil==2.2对我不起作用。

但是一个快速而肮脏的解决方法确实有效!我将python 2.7中的six.py替换为python 3.4(virtualenv)中的six.py。因为,我在 2.7 而不是 3.4 中遇到了问题。

更新

重新安装 python(并升级到 El Capitan 后)我再次遇到同样的问题。不明显的是,此错误仅发生在IPython shell 和笔记本中(当我import matplotlib.pyplot as plt时),但在 Python shell 中工作正常。

因此,没有肮脏解决方法的更好解决方案(在我的情况下确实有效)是强制安装sixipython。这是我为解决这个问题所做的:

$ pip install --ignore-installed six
$ pip install --ignore-installed ipython

您可能已经安装了任何软件包的完美安装版本,但默认使用的版本不是您想要的版本。您可以看到python搜索的路径列表,以便找到其包,如下所示:

>>> import sys
>>> sys.path

为了让 python 先搜索某个软件包的最新版本,而不是删除系统版本,可以做的是将 ~/.bash_profile(或 ~/.bashrc 如果是 linux)配置文件中的系统变量PYTHONPATH设置为安装新软件包的路径:

export PYTHONPATH=/Library/Python/2.7/site-packages

另一种方法是通过在路径列表的开头添加路径来修改 python 脚本中的 python 路径:

import sys
sys.path.insert(1,'/Library/Python/2.7/site-packages')
需要为每个

需要特定包版本的脚本执行此操作。出于某种原因,您可能希望使用已安装的旧版本。顺便说一句,我所有带有easy_install或pip或来自源代码的安装都转到/Library/Python/2.7/site-packages这适用于EL Capitan,现在也适用于macOS Sierra(10.12.2)

相关内容

最新更新