J'utilise python 2.7.6 sur Ubuntu 14.04.2 LTS. J'utilise mock pour me moquer de certains désagréments et je remarque que lorsque je l'importe, il échoue lors de l'importation des enveloppements.
Vous ne savez pas s'il existe une version différente de Mock ou six que je devrais utiliser pour que son import fonctionne? Impossible de trouver des réponses pertinentes et je n'utilise pas d'environnements virtuels.
le module dit qu'il est compatible avec python 2.7.x: https://pypi.python.org/pypi/mock
maquette == 1.1.3 six == 1.9.0
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from mock import Mock
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/mock/__init__.py", line 2, in <module>
import mock.mock as _mock
File "/usr/local/lib/python2.7/dist-packages/mock/mock.py", line 68, in <module>
from six import wraps
ImportError: cannot import name wraps
également essayé avec Sudo sans succès.
$ Sudo python -c 'from six import wraps'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: cannot import name wraps
Installé maquette == 1.0.1 et cela a fonctionné pour une raison quelconque. (hausse les épaules)
edit: La vraie solution pour moi a été de mettre à jour setuptools mis à jour et cela m’a permis de mettre à jour maquettes et six au plus tard. J'étais sur setuptools 3.3. Dans mon cas, j'ai également dû retirer ces modules à la main car ils appartenaient à OS dans '/usr/local/lib/python2.7/dist-packages/'
vérifier les versions de tout
pip freeze | grep -e six -e mock
easy_install --version
Tout mettre à jour
wget https://bootstrap.pypa.io/ez_setup.py -O - | Sudo python
pip install mock --upgrade
pip install six --upgrade
Merci @lifeless
J'ai rencontré le même problème sur mon mac, que j'ai pu résoudre en réalisant que le sys.path de mon python contenait à la fois
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
et
/Library/Python/2.7/site-packages/
avec le premier plus tôt que le dernier.
Vous pouvez vérifier si cela vous arrive en exécutant ce qui suit dans la console python.
import six
six.__version__
mon python chargeait un fichier six.py obsolète à partir de l’ancien répertoire (qui n’avait pas de wrapper), même si pip avait installé une version six plus récente dans le deuxième répertoire. (Il semble que le framework mac propose une version de six par défaut.)
J'ai pu résoudre ce problème en déplaçant six.py et six.pyc du premier répertoire (nécessite un accès Sudo), afin que python trouve la version la plus récente de six dans le deuxième répertoire. Je suis sûr que vous pouvez également modifier l'ordre des chemins dans sys.path.
Pour rechercher l’ancienne version de six à supprimer, exécutez-la à partir de la console du terminal.
find /System/Library/Frameworks/Python.framework/Versions -name six.py*
ainsi, la maquette 1.1.1 et supérieure définit une exigence de version sur six 1.7 ou supérieure:
https://github.com/testing-cabal/mock/blob/master/requirements.txt#L6
Cela est reflété dans les métadonnées de setuptools par pbr, pour lequel il existe une dépendance versionnée par setup_requires sur:
https://github.com/testing-cabal/mock/blob/master/setup.py#L17
Il y a donc plusieurs possibilités: 1) six 1.7 n’est pas assez nouveau 2) il existe un paquetage de la distribution six prétendant être 1.9.0 qui n’a pas de wraps pour une raison quelconque 3) le setuptools en cours d'utilisation n'a pas été correctement intégré à pbr et les dépôts sont manquants 4) les métadonnées de la roue ne sont pas interrogées correctement par votre combinaison pip/setuptools.
Nous avons une exigence stricte pour setuptools 17.1, et cela n’a été explicitement signalé que récemment par setup.py. J'adorerais si vous pouviez déterminer lequel de ces cas était le cas et mettre à jour https://github.com/testing-cabal/mock/issues/298 afin que nous puissions réparer les interactions qui mènent à ce silence échec de setup.py/wheel.
Sur Mac OSX, la version précédemment installée de six bloquait l’utilisation de ma version mise à niveau. J'ai vérifié cela, comme suggéré précédemment, en exécutant ce qui suit dans mon interpréteur:
import six
six.__version__
Pour résoudre ce problème, j'ai déplacé le fichier:
mv/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.py
/tmp/old_six.py
Ceci est déjà indiqué dans une autre réponse sur ce site, mais je voulais fournir une réponse plus simple.
À l’origine, j’avais un problème avec les anciennes versions de «pip/setuptools» appartenant à l’OS. Après avoir installé pip manuellement, comme ceci:
wget https://bootstrap.pypa.io/get-pip.py
Sudo python get-pip.py
Sudo ln -s /usr/local/bin/pip /usr/bin/pip
Puis, en installant la dernière version de pip
, mock
et six
, le problème que vous avez décrit ci-dessus demeurait. Il s'avère que j'en avais six installés deux fois dans:
/usr/lib/python2.7/dist-packages/
et en
/usr/local/lib/python2.7/dist-packages/
Après avoir enlevé les six de/usr/lib/cela a bien fonctionné: rm /usr/lib/python2.7/dist-packages/*six*
J'ai fait une installation pip de six == 1.9.0 et il a fallu la nouvelle version. Il semble que mock == 1.3.0 ne définisse pas correctement la version de six dont il a besoin pour prendre en charge les enveloppes.
Une autre solution consiste à configurer votre variable d’environnement PYTHONPATH pour qu’elle pointe vers les packages installés.
Paramétrer ma variable d’environnement dans ma configuration bash pour que:
PYTHONPATH=/Library/Python/2.7/site-packages
M'a permis d'exécuter des tests dans le terminal (sans supprimer/renommer les bibliothèques, etc.).
Cependant, lors de l’utilisation de PyCharm, cette variable d’environnement n’était pas importée correctement. Même si PyCharm indiquait que les variables parentes étaient incluses (avec celles répertoriées dans celles importées), il semble que cette importation ne fonctionnait pas correctement.
La définition manuelle de la variable d'environnement sur celle indiquée ci-dessus dans la configuration d'exécution de PyCharm résout ce problème.
Je ne sais pas si PyCharm écrase la variable PYTHONPATH après l'avoir importée à partir de variables d'environnement système ou d'une autre supercherie, mais cela a résolu l'erreur pour moi.
J'ai trouvé des choses intéressantes! Il y a un fichier nommé "functools.py" dans le chemin racine de mon projet, et pendant que j'exécute mon projet, pycharm va générer ImportError . Je renomme donc mon fichier et corrige ce problème ~~
Bien que vous n'utilisiez pas un environnement virtuel tel que virtualenv
, c'est certainement un excellent cas d'utilisation. En mettant en sandbox votre installation Python et toutes les dépendances de votre projet, vous évitez de pirater l'installation Python global/par défaut, d'où provient en grande partie la complexité/difficulté.
C’est ce que j’ai utilisé lors de l’erreur wraps
- Requirements.txt contient mock==2.0.0
et six==1.10.0
:
cd <my_project>
virtualenv venv
source venv/bin/activate
Sudo pip install -r requirements.txt
À mon avis, cette solution est non seulement plus simple à utiliser, mais elle est également plus simple à documenter pour les personnes souhaitant exécuter votre code.