在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笔记本内联)。
在最新的six
和dateutil
版本中解决了这个问题。 但是,在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.py
replacepython 2.7中的six.py
因为,我有2.7的问题,但不是3.4。
UPDATE
我重新安装python后(并升级到埃尔卡皮坦后)再次有同样的问题。 不明显的是,这个错误只发生在IPython
shell和笔记本(当我import matplotlib.pyplot as plt
),但从Pythonshell工作正常。
所以一个更好的解决scheme(在我的情况下工作)没有一个肮脏的解决办法是强制安装six
ipython
。 以下是我所做的修正:
$ pip install --ignore-installed six $ pip install --ignore-installed ipython