OS X上的Matplotlib问题(“ ImportError:无法导入名称_thread”)


77

在最近几天的某个时候,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)。

Answers:


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

尽管我最近升级到优胜美地,但今天下午我也收到了同样的错误消息。我不太确定我是否理解为什么将dateutil还原到以前的版本对我有用,但是由于运行上述命令,我没有遇到任何麻烦(我通常在ipython笔记本中使用pyplot inline)。


1
谢谢,这也为我解决了这个问题。我向开发人员提交了一个错误:github.com/dateutil/dateutil/issues/12
Dolan Antenucci

3
我认为更新您的版本six也可以。
tacaswell 2014年

3
感谢您的建议@tcaswell,我调查了它,并且已经在运行最新版本的6。
2014年

1
参见bitbucket.org/gutworth/six/issue/39/…,虽然也许已经一岁了……
tacaswell 2014年

2
似乎是El Capitan的新问题-” /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.py”中包含旧版本的“六”如果不禁用无根目录,则无法升级。
Michael Scott Cuthbert

45

此问题已在最新的sixdateutil版本。但是,在OS X中,即使您six将其更新为最新版本,也可能实际上未正确更新它。这就是我发生的事情:

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

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

这为我解决了这个问题。


不幸的是,由于无根功能的保护,这不再适用于El Capitan。
Michael Scott Cuthbert

我刚刚读到了“无根功能”(在apple.stackexchange.com/questions/193368/…),这似乎是一个糟糕的主意。我猜在El Capitan中,人们必须使用virtualenv才能完全控制自己的Python安装。
Oriol Nieto

2
这对我在10.10.4上有效(我还有一个较新的6版本,该版本通过pip安装,但默认情况下未导入)。谢谢。
Leo Fang

1
而不是删除系统版本。我所做的是设置系统变量:PYTHONPATH ='/ Library / Python / 2.7 / site-packages'。或在您的应用程序中:import sys; sys.path.insert(1,'/ Library / Python / 2.7 / site-packages')
Pablo Reyes

由于某种原因,“ sudo pip install six -U”更新了我的/usr/local/bin/python2.7/site-packages文件夹中的六个模块。我必须将6. *从该文件夹复制到/Library/Python/2.7/site-packages才能正常工作。启动
docker

10

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

但是,一种快速而又肮脏的解决方法确实有效!我用python 3.4(virtualenv)six.py中的python 2.7替换了six.py。从那以后,我在2.7中遇到了问题,但没有3.4。

更新

重新安装python之后(升级到El Capitan之后),我又遇到了同样的问题。不明显的是,此错误仅在IPython外壳和笔记本中发生(当我这​​样做时import matplotlib.pyplot as plt),但在Python Shell中可以正常工作。

因此,一个更好的解决方案(在我的情况下确实有效)而又没有坏的解决方法,则是强制同时安装sixipython。这是我修复此问题的方法:

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

1
我有同样的问题。dateutil修复无效。我不太想破解2.7,还有更好的主意吗?
user1460739 2015年

10

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

>>> import sys
>>> sys.path

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

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)中也有效

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.