web-dev-qa-db-fra.com

Problème Matplotlib sous OS X ("ImportError: impossible d'importer le nom _thread")

Au cours des derniers jours, Matplotlib a cessé de travailler pour moi sous OS X. Voici l'erreur que j'obtiens en essayant de 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

Le seul changement de système auquel je puisse penser est la mise à jour NTP) d'Apple forcée et peut-être certaines modifications d'autorisation que j'ai apportées dans/usr/local pour que Brew fonctionne à nouveau.

J'ai essayé de réinstaller Matplotlib et Python-dateutil via Pip, mais cela n'a pas aidé. Aussi essayé un redémarrage. J'utilise Python 2.7.6, situé dans/usr/bin/python. J'utilise Yosemite (OS X 10.10.1).

77
Dolan Antenucci
Sudo pip uninstall python-dateutil
Sudo pip install python-dateutil==2.2

J'ai eu le même message d'erreur cet après-midi également, bien que je me sois récemment mis à niveau vers Yosemite. Je ne suis pas tout à fait sûr de comprendre pourquoi revenir de dateutil à une version antérieure fonctionne pour moi, mais je ne rencontre plus aucun problème depuis que je travaille ci-dessus (j'utilise généralement pyplot inline dans un cahier ipython).

191
wil3

Ce problème est résolu dans les dernières versions de six et dateutil. Cependant, sous OS X, même si vous mettez à jour votre six vers la dernière version, il se peut que vous ne le mettiez pas à jour correctement. Voilà ce qui m'est arrivé:

Après avoir fait un pip2 install six -U, le nouveau module six a été installé dans /Library/Python/2.7/site-packages/. Cependant, lorsque j'ai chargé six dans un terminal python 2.7) et vérifié son chemin, voici ce que j'ai obtenu:

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

Donc, python utilisait une ancienne version de six, que j'ai supprimée en tapant:

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

Cela a résolu ce problème pour moi.

45
Oriol Nieto

Installation du python-dateutil==2.2 N'a pas travaillé pour moi.

Mais une solution de contournement rapide et efficace a fonctionné! Je remplace six.py in python 2.7 avec le six.py de python 3.4 (virtualenv). Depuis, j'ai le problème en 2.7 mais pas en 3.4.

MISE À JOUR

J'ai eu le même problème à nouveau après la réinstallation de python (et après la mise à niveau vers El Capitan). Ce qui est évident, c'est que cette erreur ne se produit que dans le shell [IPython de Je fais import matplotlib.pyplot as plt) mais fonctionne très bien à partir d’un Python Shell.

Donc, une meilleure solution (qui a fonctionné dans mon cas) sans solution de contournement consiste à forcer l’installation de six et de ipython. Voici ce que j'ai fait pour que cela soit corrigé:

$ pip install --ignore-installed six
$ pip install --ignore-installed ipython
10
Aziz Alto

Il est possible que vous disposiez d'une version parfaitement installée de tous les packages que vous avez installés, mais la version utilisée par défaut n'est pas celle que vous souhaitez. Vous pouvez voir la liste des chemins que python cherche dans afin de trouver ses paquets comme suit:

>>> import sys
>>> sys.path

Afin de laisser python rechercher tout d’abord la version la plus mise à jour de certains paquets, au lieu de supprimer la version système, vous pouvez définir la variable système PYTHONPATH dans la liste ~. /.bash_profile (ou ~/.bashrc si linux) fichier de configuration vers le chemin où les nouveaux packages sont installés:

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

Une alternative consiste à modifier le chemin python dans votre script python en ajoutant le chemin au début de la liste des chemins:

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

Cela doit être fait pour chaque script pour lequel vous avez besoin d'une certaine version du paquet. Vous pouvez utiliser pour une raison quelconque une version plus ancienne que vous avez installée. BTW toutes mes installations avec easy_install, ou pip, ou depuis des sources, allez à /Library/Python/2.7/site-packages Cela fonctionnait dans EL Capitan, et maintenant aussi dans macOS Sierra (10.12.2)

10
Pablo Reyes