Проблема Matplotlib в OS X ("ImportError: не удается импортировать поток имен")


в какой-то момент в последние несколько дней 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).

4 76

4 ответа:

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

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

эта проблема исправлена в последней 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.*

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

установка python-dateutil==2.2 не работает для меня.

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

обновление

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

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

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

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

>>> import sys
>>> sys.path

для того, чтобы позволить питон поиск самых обновленные версии некоторых пакетов, вместо удаления предыдущей версии системы, что может быть сделано, чтобы установить системную переменную PYTHONPATH в ~/.файл (или ~/.bashrc если 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, или из источников, перейти к / Библиотека / Python / 2.7 / site-packages Это работало en EL Capitan, а теперь и в macOS Sierra (10.12.2)