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

Dol*_*cci 77 python macos matplotlib python-2.7 python-dateutil

在最近几天的某个时刻,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
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一系统变化是Apple强制的NTP更新,也许我在/ usr/local做了一些权限更改,让Brew再次运行.

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

wil*_*il3 191

sudo pip uninstall python-dateutil
sudo pip install python-dateutil==2.2
Run Code Online (Sandbox Code Playgroud)

我今天下午也有同样的错误信息,虽然我最近升级到优胜美地.我不完全确定我理解为什么将dateutil恢复到以前的版本对我有用,但是因为运行上面的我没有遇到麻烦(我通常在ipython笔记本中使用pyplot内联).

  • 我认为更新你的`six`版本也会有用. (3认同)
  • 感谢您的建议@tcaswell,我调查了它,我已经运行了最新版本的六个. (3认同)
  • 似乎是El Capitan的一个新问题 - "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.py"中包含旧版"六",它可以升级而不禁用无根. (2认同)

Ori*_*eto 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
Run Code Online (Sandbox Code Playgroud)

所以,python使用的是旧版本six,我通过输入删除了:

rm -rf /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.*
Run Code Online (Sandbox Code Playgroud)

这为我解决了这个问题.

  • 这对我来说在10.10.4上工作(我还有一个较新的版本,它由pip安装,但默认情况下不导入).谢谢. (2认同)

Azi*_*lto 10

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

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

UPDATE

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

所以一个更好的解决方案(在我的情况下工作)没有一个肮脏的解决方法是强制安装sixipython.以下是我修复此问题的方法:

$ pip install --ignore-installed six
$ pip install --ignore-installed ipython
Run Code Online (Sandbox Code Playgroud)


Pab*_*yes 10

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

>>> import sys
>>> sys.path
Run Code Online (Sandbox Code Playgroud)

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

export PYTHONPATH=/Library/Python/2.7/site-packages
Run Code Online (Sandbox Code Playgroud)

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

import sys
sys.path.insert(1,'/Library/Python/2.7/site-packages')
Run Code Online (Sandbox Code Playgroud)

这需要针对您需要特定包版本的每个脚本执行此操作.您可能由于某种原因需要使用已安装的旧版本.BTW我使用easy_install或pip进行的所有安装,或者从源代码转到/Library/Python/2.7/site-packages这对EL Capitan有效,现在也在macOS Sierra(10.12.2)