在OS X上的Matplotlib问题(“ImportError:无法导入名称_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到以前的版本为我工作,但由于运行上述我没有任何问题(我通常使用pyplot在ipython笔记本内联)。

在最新的sixdateutil版本中解决了这个问题。 但是,在OS X中,即使将six更新为最新版本,也可能实际上没有正确更新它。 这是发生在我身上的事情:

在做一个pip2 install six -U ,新的six模块安装在/Library/Python/2.7/site-packages/ 。 然而,当我在Python 2.7terminal中加载了six ,并且检查了它的path时,我得到了以下结果:

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

这为我解决了这个问题。

您可能已经安装了任何软件包的完全安装版本,但默认使用的版本不是您想要的版本。 你可以看到pythonsearch的path列表,以便find它的包,如下所示:

 >>> import sys >>> sys.path 

为了让python首先search某个软件包的最新版本,而不是删除系统版本,可以在〜/ .bash_profile(或〜/ .bashrc if linux)configuration文件中设置系统variablesPYTHONPATH到新软件包的安装path:

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

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

 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)

安装python-dateutil==2.2不适合我。

但是一个快速和肮脏的解决方法确实工作! 我用Python 3.4(virtualenv)中的six.pyreplacepython 2.7中的six.py 因为,我有2.7的问题,但不是3.4。

UPDATE

我重新安装python后(并升级到埃尔卡皮坦后)再次有同样的问题。 不明显的是,这个错误只发生在IPythonshell和笔记本(当我import matplotlib.pyplot as plt ),但从Pythonshell工作正常。

所以一个更好的解决scheme(在我的情况下工作)没有一个肮脏的解决办法是强制安装six ipython 。 以下是我所做的修正:

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