Matplotlib-Problem unter OS X ("ImportError: Name _thread kann nicht importiert werden")

77

Irgendwann in den letzten Tagen hat Matplotlib unter OS X aufgehört, für mich zu arbeiten. Hier ist der Fehler, den ich bekomme, wenn ich versuche 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

Die einzige Systemänderung, an die ich denken kann, war das von Apple erzwungene NTP-Update und möglicherweise einige Berechtigungsänderungen, die ich in / usr / local vorgenommen habe, um Brew wieder zum Laufen zu bringen.

Ich habe versucht, Matplotlib und Python-dateutil über Pip neu zu installieren, aber das hat nicht geholfen. Habe auch einen Neustart versucht. Ich verwende Python 2.7.6, das sich in / usr / bin / python befindet. Ich verwende Yosemite (OS X 10.10.1).

Dolan Antenucci
quelle

Antworten:

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

Ich hatte heute Nachmittag die gleiche Fehlermeldung, obwohl ich kürzlich ein Upgrade auf Yosemite durchgeführt habe. Ich bin mir nicht ganz sicher, ob ich verstehe, warum das Zurücksetzen von dateutil auf eine frühere Version für mich funktioniert, aber seit ich die oben genannten Schritte ausgeführt habe, habe ich keine Probleme (ich verwende Pyplot inline im Allgemeinen in einem Ipython-Notizbuch).

wil3
quelle
1
Danke, das hat das Problem auch für mich gelöst. Ich habe dem Entwickler einen Fehler gemeldet
Dolan Antenucci
3
Ich denke, das Aktualisieren Ihrer Version von sixwürde auch funktionieren.
Tacaswell
3
Vielen Dank für Ihren Vorschlag @tcaswell, ich habe mich darum gekümmert und verwende bereits die neueste Version von sechs.
wil3
1
Siehe bitbucket.org/gutworth/six/issue/39/… , vielleicht ist das aber ein Jahr alt ...
Tacaswell
2
Scheint ein neues Problem in El Capitan zu sein - eine alte Version von "six" ist in '' /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.py 'enthalten Kein Upgrade ohne Deaktivierung von rootless.
Michael Scott Cuthbert
45

Dieses Problem wird in den neuesten festen sixund dateutilVersionen. Selbst wenn Sie in OS X Ihre sixVersion auf die neueste Version aktualisieren, wird sie möglicherweise nicht richtig aktualisiert. Das ist mir passiert:

Nach a pip2 install six -Uwurde das neue sixModul in installiert /Library/Python/2.7/site-packages/. Als ich jedoch sixein Python 2.7-Terminal geladen und dessen Pfad überprüft habe, habe ich Folgendes erhalten:

import six
print six.__file__
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.pyc

Python verwendete also eine alte Version von six, die ich durch Eingabe von:

rm -rf /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.*

Dies hat dieses Problem für mich behoben.

Oriol Nieto
quelle
Leider funktioniert dies mit El Capitan aufgrund des Schutzes der Rootless-Funktion nicht mehr.
Michael Scott Cuthbert
Ich habe gerade gelesen, was die "rootless-Funktion" ist (hier apple.stackexchange.com/questions/193368/… ) und es scheint eine schreckliche Idee zu sein. Ich denke, in El Capitan müssen die Leute eine virtuelle Umgebung verwenden, um die volle Kontrolle über ihre Python-Installationen zu haben.
Oriol Nieto
2
Dies funktionierte für mich am 10.10.4 (ich habe auch eine neuere Version von sechs, die von pip installiert, aber nicht standardmäßig importiert wird). Vielen Dank.
Leo Fang
1
Anstatt die Systemversion zu entfernen. Ich habe die Systemvariable gesetzt: PYTHONPATH = '/ Library / Python / 2.7 / site-packages'. Oder in Ihrer Anwendung: import sys; sys.path.insert (1, '/ Library / Python / 2.7 / site-packages')
Pablo Reyes
Aus irgendeinem Grund hat 'sudo pip install six -U' die sechs Module in meinem Ordner /usr/local/bin/python2.7/site-packages aktualisiert. Ich musste sechs. * Aus diesem Ordner in /Library/Python/2.7/site-packages kopieren, damit es funktioniert.
Hatte
10

Die Installation von python-dateutil==2.2hat bei mir nicht funktioniert.

Aber eine schnelle und schmutzige Problemumgehung hat funktioniert! Ich ersetze six.pyin Python 2.7 durch das six.pyvon Python 3.4 (virtualenv). Da habe ich das Problem in 2.7 aber nicht in 3.4.

AKTUALISIEREN

Ich hatte das gleiche Problem erneut nach der Neuinstallation von Python (und nach dem Upgrade auf El Capitan). Es ist nicht offensichtlich, dass dieser Fehler nur in der IPythonShell und im Notebook auftritt (wenn ich das tue import matplotlib.pyplot as plt), aber in einer Python-Shell einwandfrei funktioniert.

Eine bessere Lösung (die in meinem Fall funktioniert hat) ohne eine schmutzige Umgehung besteht darin, die Installation von sixund zu erzwingen ipython. Folgendes habe ich getan, um dieses Problem zu beheben:

$ pip install --ignore-installed six
$ pip install --ignore-installed ipython
Aziz Alto
quelle
1
Ich habe das gleiche Problem. Das Dateutil-Update hat nicht funktioniert. Ich bin nicht so scharf darauf, meine 2.7 zu hacken, irgendwelche besseren Ideen?
user1460739
10

Es ist möglich, dass Sie eine perfekt installierte Version aller von Ihnen installierten Pakete haben, aber die standardmäßig verwendete Version ist nicht die gewünschte. Sie können die Liste der Pfade sehen, über die Python sucht, um seine Pakete wie folgt zu finden:

>>> import sys
>>> sys.path

Damit Python zuerst die aktuellste Version eines bestimmten Pakets durchsuchen kann, anstatt die Systemversion zu entfernen, können Sie die Systemvariable PYTHONPATHin der Konfigurationsdatei ~ / .bash_profile (oder ~ / .bashrc, wenn Linux) auf setzen Der Pfad, in dem die neuen Pakete installiert werden:

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

Eine Alternative besteht darin, den Python-Pfad in Ihrem Python-Skript zu ändern, indem Sie den Pfad am Anfang der Pfadliste hinzufügen:

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

Dies muss für jedes Skript durchgeführt werden, für das Sie eine bestimmte Paketversion benötigen. Möglicherweise möchten Sie aus irgendeinem Grund eine ältere Version verwenden, die Sie installiert haben. Übrigens gehen alle meine Installationen mit easy_install oder pip oder aus Quellen zu /Library/Python/2.7/site-packages. Dies funktionierte in EL Capitan und jetzt auch in macOS Sierra (10.12.2).

Pablo Reyes
quelle