Випуск Matplotlib в OS X (“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

Єдина зміна системи, про яку я можу подумати, - це примусове оновлення NTP від ​​Apple, і, можливо, деякі зміни дозволів, які я зробив у / usr / local, щоб знову запустити Brew.

Я спробував переінсталювати Matplotlib і Python-dateutil через Pip, але це не допомогло. Також спробував перезавантажити. У мене запущений Python 2.7.6, який знаходиться в / usr / bin / python. Я запускаю Yosemite (OS X 10.10.1).

Відповіді:


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

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


1
Дякую, це вирішило проблему і для мене. Я подав помилку розробнику: github.com/dateutil/dateutil/issues/12
Dolan Antenucci

3
Я думаю, оновлення вашої версії sixтакож буде працювати.
tacaswell

3
Дякую за вашу пропозицію @tcaswell, я вивчив її і вже запускаю останню версію з шести.
wil3

1
Див. Bitbucket.org/gutworth/six/issue/39/… , можливо, це вже рік тому ...
tacaswell

2
Здається, це новий випуск в El Capitan - стара версія "шістки" включена в '' /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.py ', яка може не буде модернізовано без відключення без коренів.
Майкл Скотт Катберт,

45

Ця проблема виправлена ​​в останніх версіях 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.*

Це вирішило цю проблему для мене.


На жаль, це більше не працює з El Capitan через захист функції без коренів.
Майкл Скотт Катберт,

Я щойно прочитав, що таке "особливість без коренів" (тут apple.stackexchange.com/questions/193368/… ), і це здається жахливою ідеєю. Я думаю, в El Capitan людям доведеться використовувати virtualenv, щоб мати повний контроль над своїми встановленнями Python.
Oriol Nieto

2
Це спрацювало для мене 10.10.4 (у мене також є новіша версія із шести, яка встановлюється за допомогою pip, але не імпортується за замовчуванням). Дякую.
Leo Fang

1
Замість видалення версії системи. Я зробив установку системної змінної: PYTHONPATH = '/ Library / Python / 2.7 / site-пакети'. Або у вашому додатку: import sys; sys.path.insert (1, '/ Library / Python / 2.7 / site-пакети')
Пабло Рейес,

З якоїсь причини 'sudo pip install six -U' оновив шість модулів у моїй папці /usr/local/bin/python2.7/site-packages. Мені довелося скопіювати шість. * З цієї папки в /Library/Python/2.7/site-packages, щоб це працювало.
Виникла

10

Встановлення 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

1
У мене те саме питання. Виправлення dateutil не спрацювало. Я не дуже хочу зламати свій 2.7, кращі ідеї?
user1460739

10

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

>>> import sys
>>> sys.path

Для того, щоб дозволити python шукати спочатку найбільш оновлену версію певного пакету, замість того, щоб видалити системну версію, можна зробити так, щоб встановити системну змінну PYTHONPATHу файлі конфігурації ~ / .bash_profile (або ~ / .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, або з джерел перейдіть до /Library/Python/2.7/site-packages Це спрацювало в EL Capitan, а тепер і в macOS Sierra (10.12.2)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.