J'utilise python 2.7.6 sur Ubuntu 14.04.2 LTS. J'utilise la simulation pour se moquer de certains tests et je remarque que lorsque j'importe une simulation, l'importation des wraps échoue.

Vous ne savez pas s'il existe une version différente de Mock ou six que je devrais utiliser pour que l'importation fonctionne? Impossible de trouver des réponses pertinentes et je n'utilise pas d'environnements virtuels.

Le module de simulation 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 chance.

$ sudo python -c 'from six import wraps'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: cannot import name wraps
25
Michael 15 juil. 2015 à 00:46

9 réponses

Meilleure réponse

Mock installé == 1.0.1 et cela a fonctionné pour une raison quelconque. (hausse les épaules)

Edit: La vraie solution pour moi était de mettre à jour setuptools au plus tard et cela m'a permis de mettre à niveau mock et six au plus tard. J'étais sur setuptools 3.3. Dans mon cas, j'ai également dû supprimer lesdits 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

31
Michael 28 juil. 2015 à 20:26

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 je lance mon projet, pycharm lèvera ImportError. Donc, je renomme mon fichier pour résoudre ce problème ~~

0
user9980897 12 sept. 2018 à 10:34

Bien que vous n'utilisiez pas un environnement virtuel comme virtualenv, c'est certainement un excellent cas d'utilisation. En sandboxant votre installation Python et toutes les dépendances de votre projet, vous pouvez éviter de pirater complètement l'installation python globale / par défaut, d'où la complexité / difficulté provient.

Voici ce que j'ai utilisé lorsque j'ai eu 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

Non seulement c'est plus simple à utiliser à mon avis, mais c'est aussi plus simple à documenter pour les personnes qui pourraient vouloir exécuter votre code.

0
killthrush 27 août 2016 à 13:55

Une autre solution consiste à définir votre variable d'environnement PYTHONPATH pour pointer vers les packages installés.

Définir ma variable d'environnement dans ma configuration bash pour que:

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

Me permet d'exécuter des tests dans le terminal (sans supprimer / renommer aucune bibliothèque, etc.).

Cependant, lors de l'utilisation de PyCharm, il n'était pas utile d'importer correctement cette variable d'environnement. Même si PyCharm montrait qu'il incluait des variables parentes (avec celles listées dans celles qu'il montrait importées), il semble que cette importation ne fonctionnait pas correctement.

La définition manuelle de la variable d'environnement sur ce qui précède dans la configuration d'exécution 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 astuce, mais cela a résolu l'erreur pour moi.

1
enderland 22 févr. 2016 à 15:57

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 obtenir le support des wraps.

1
Jordan 27 juil. 2015 à 20:42

J'ai eu à l'origine un problème avec les anciennes versions "appartenant au système d'exploitation" et pip / setuptools. 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

Et puis, en installant la dernière version de pip, mock et six, j'ai toujours eu le problème que vous avez décrit ci-dessus. 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 supprimé les six de / usr / lib /, cela a bien fonctionné: rm /usr/lib/python2.7/dist-packages/*six*

2
VitalyB 29 juil. 2015 à 12:54

Sur Mac OSX, la version de six précédemment installée 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ète:

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

Cela est déjà indiqué dans une autre réponse sur ce site, mais je voulais apporter une réponse plus simple.

3
Control Complex 12 nov. 2015 à 16:13

Donc la maquette 1.1.1 et supérieure définit une exigence versionnée sur six 1.7 ou supérieur:

https://github.com/testing-cabal/mock/blob/master/requirements.txt#L6

Cela se reflète dans les métadonnées setuptools par pbr, sur lequel il existe une dépendance setup_requires versionnée:

https://github.com/testing-cabal/mock/blob/master/setup.py#L17

Il y a donc quelques possibilités: 1) six 1.7 n'est pas assez nouveau 2) il y a un paquet distro six prétendant être 1.9.0 qui n'a pas de wraps pour une raison quelconque 3) les setuptools utilisés ne se sont pas correctement intégrés avec pbr et dep sont manquants 4) les métadonnées de 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 par setup.py plus récemment. Je serais ravi si vous pouvez comprendre lequel de ces cas est le cas et mettre à jour https: // github.com/testing-cabal/mock/issues/298 afin que nous puissions corriger toute interaction conduisant à cette panne silencieuse de setup.py / roues.

5
lifeless 28 juil. 2015 à 18:09

J'ai rencontré le même problème sur mon Mac, que j'ai pu résoudre en réalisant que le chemin 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 second.

Vous pouvez tester si cela vous arrive en exécutant ce qui suit dans la console python.

import six
six.__version__

Mon python chargeait un six.py obsolète à partir de l'ancien répertoire (qui n'avait pas de wrapper), même si pip avait installé une nouvelle version six dans le deuxième répertoire. (Il semble que le cadre de mac soit livré avec une version de six par défaut.)

J'ai pu le corriger 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 trouver l'ancienne version de six qui doit être supprimée, exécutez-la à partir de la console du terminal

find /System/Library/Frameworks/Python.framework/Versions -name six.py*
19
Control Complex 12 nov. 2015 à 20:01