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

Posted

技术标签:

【中文标题】OS X 上的 Matplotlib 问题(“ImportError: cannot import name _thread”)【英文标题】:Matplotlib issue on OS X ("ImportError: cannot import name _thread") 【发布时间】:2015-02-22 04:06:29 【问题描述】:

在过去几天的某个时候,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。我正在运行 Yosemite (OS X 10.10.1)。

【问题讨论】:

【参考方案1】:
sudo pip uninstall python-dateutil
sudo pip install python-dateutil==2.2

我今天下午也收到了同样的错误消息,尽管我最近确实升级到了 Yosemite。我不完全确定我理解为什么将 dateutil 恢复到以前的版本对我有用,但是由于运行上述我没有任何问题(我通常在 ipython 笔记本中使用 pyplot inline)。

【讨论】:

谢谢,这也为我解决了这个问题。我向开发者提交了一个错误:github.com/dateutil/dateutil/issues/12 我认为更新您的six 版本也可以。 感谢您的建议@tcaswell,我调查了一下,我已经在运行最新版本的 6。 见bitbucket.org/gutworth/six/issue/39/…,虽然可能已经一岁了...... 似乎是 El Capitan 的一个新问题——旧版本的“六”包含在 ''/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/ python/six.py' 不禁用rootless就无法升级。【参考方案2】:

此问题已在最新的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.*

这为我解决了这个问题。

【讨论】:

不幸的是,由于无根功能的保护,这不再适用于 El Capitan。 我刚刚阅读了“无根功能”是什么(此处为apple.stackexchange.com/questions/193368/…),这似乎是一个糟糕的主意。我想在 El Capitan 中,人们必须使用 virtualenv 才能完全控制他们的 Python 安装。 这在 10.10.4 上对我有用(我还有一个更新版本的 6,它由 pip 安装但默认不导入)。谢谢。 而不是删除系统版本。我所做的是设置系统变量:PYTHONPATH='/Library/Python/2.7/site-packages'。或者在您的应用程序中: import sys;sys.path.insert(1,'/Library/Python/2.7/site-packages') 出于某种原因,“sudo pip install 6 -U”更新了我的 /usr/local/bin/python2.7/site-packages 文件夹中的六个模块。我必须从这个文件夹中复制六个。* 到 /Library/Python/2.7/site-packages 以使其工作。启动 docker-compose 时出错...【参考方案3】:

安装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

【讨论】:

我也有同样的问题。 dateutil 修复不起作用。我不是那么热衷于破解我的 2.7,有更好的想法吗?【参考方案4】:

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

>>> import sys
>>> sys.path

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

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)

【讨论】:

以上是关于OS X 上的 Matplotlib 问题(“ImportError: cannot import name _thread”)的主要内容,如果未能解决你的问题,请参考以下文章

Mac OS 上的 Cartopy 安装:Python 3.8 和 Matplotlib 3.3.3

在 Mac OS X 上以编程方式为 Matplotlib 选择正确的后端

Mac OS Pycharm 上的 Python 通过“import matplotlib.pyplot as plt”给出框架错误

在 Mac OS X 10.12.5 中将 matplotlib.pyplot 导入为 plt 错误

Matplotlib:make_image()莫名其妙的错误

使用 Matplotlib 在 x 轴上的月份名称偏移