Проблема Matplotlib в OS X ( "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

Единственное системное изменение, о котором я могу думать, - это обновление NTP от Apple, и, возможно, некоторые изменения прав, которые я сделал в /usr/local, чтобы снова работать с Brew.

Я попытался переустановить как Matplotlib, так и Python-dateutil через Pip, но это не помогло. Также попробовал перезагрузку. Я запускаю 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

У меня тоже было сообщение об ошибке сегодня днем, хотя я недавно обновился до Йосемити. Я не совсем уверен, что понимаю, почему для меня работает возвращение dateutil к предыдущей версии, но, поскольку я выполняю вышеуказанное, у меня нет проблем (обычно я использую pyplot inline в ноутбуке ipython).

Ответ 2

Эта проблема исправлена ​​в последних версиях six и dateutil. Однако в 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.*

Это исправило эту проблему для меня.

Ответ 3

Возможно, у вас есть совершенно установленная версия любых пакетов, которые вы установили, но используемая по умолчанию версия не та, которая вам нужна. Вы можете просмотреть список путей поиска python, чтобы найти его пакеты следующим образом:

>>> import sys
>>> sys.path

Чтобы позволить python сначала искать наиболее обновленную версию определенного пакета, вместо того, чтобы удалять версию системы, что можно сделать, это установить системную переменную PYTHONPATH в ~/.bash_profile (или ~/.bashrc if linux) в путь, на котором установлены новые пакеты:

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

Альтернативой является изменение пути python внутри вашего python script путем добавления пути в начале списка путей:

import sys
sys.path.insert(1,'/Library/Python/2.7/site-packages')

Это нужно сделать для каждого script вам нужна определенная версия пакета. По какой-то причине вы можете захотеть использовать старую версию, которую вы установили. BTW все мои установки с помощью easy_install, или pip, или из источников перейдите в /Library/Python/ 2.7/site-packages Это работало в EL Capitan, а теперь также в macOS Sierra (10.12.2)

Ответ 4

Установка python-dateutil==2.2 не помогла мне.

Но быстрое и грязное обходное решение действительно сработало! Я заменяю six.py на python 2.7 с помощью six.py из python 3.4 (virtualenv). Так как у меня проблема в 2,7, но не в 3,4.

UPDATE

У меня была такая же проблема снова после переустановки python (и после обновления до El Capitan). Непонятная вещь заключается в том, что эта ошибка возникает только в оболочке IPython и ноутбуке (когда я делаю import matplotlib.pyplot as plt), но отлично работает с оболочкой Python.

Таким образом, лучшее решение (работающее в моем случае) без грязной работы - это установить как six, так и IPython. Вот что я сделал, чтобы зафиксировать это:

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