Подтвердить что ты не робот

ImportError: невозможно импортировать обертывания имен

Я использую python 2.7.6 на Ubuntu 14.04.2 LTS. Я использую mock, чтобы высмеивать некоторые unittests и замечая, когда я импортирую mock, это не приводит к импортированию оберток.

Не уверен, есть ли другая версия макета или шесть, которые я должен использовать для импорта, чтобы работать? Не удалось найти соответствующие ответы, и я не использую виртуальные среды.

модуль mock говорит, что он совместим с python 2.7.x: https://pypi.python.org/pypi/mock

издеваться == 1.1.3 шесть == 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

также пытался с sudo не повезло.

$ sudo python -c 'from six import wraps'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: cannot import name wraps
4b9b3361

Ответ 1

Установлен mock == 1.0.1, и это по какой-то причине сработало. (Пожимает плечами)

edit: реальное исправление для меня было до обновлено setuptools до последней версии, и это позволило мне обновить макет и шесть до последних. Я был на setuptools 3.3. В моем случае мне также пришлось удалить указанные модули вручную, потому что они принадлежали ОС в папке /usr/local/lib/python 2.7/dist-packages/'

проверить версии всего

pip freeze | grep -e six -e mock
easy_install --version

Обновить все

wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python
pip install mock --upgrade
pip install six --upgrade

Спасибо @lifeless

Ответ 2

Я столкнулся с той же проблемой на моем mac, который я смог исправить, осознав, что мой python sys.path содержит как

/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/

и

/Library/Python/2.7/site-packages/

с первым ранее последнего.

Вы можете проверить, если это происходит с вами, выполнив следующее в консоли python.

import six
six.__version__

my python загружал устаревший файл six.py из прежнего каталога (который не имел обертки), хотя pip установил более новую версию шесть во втором каталоге. (Похоже, что у mac framework есть версия по умолчанию по умолчанию.)

Мне удалось исправить это, переместив six.py и six.pyc из первого каталога (требуется sudo-доступ), так что python найдет более новую версию из шести во втором каталоге. Я уверен, что вы также можете изменить порядок путей в sys.path.

Чтобы найти более старую версию из шести, которые необходимо удалить, запустите это с консоли терминала

find /System/Library/Frameworks/Python.framework/Versions -name six.py*

Ответ 3

поэтому макет 1.1.1 и выше определяет требования к версии на шести 1.7 или выше:

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

Это находит отражение в метаданных setuptools на pbr, что зависит от версии setup_requires:

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

Итак, есть несколько возможностей: 1) шесть 1.7 не являются достаточно новыми 2) есть дистрибутив шесть пакетов, претендующих на 1,9,0, которые по какой-то причине не имеют оберток 3) используемые инструменты setuptools не интегрировались должным образом с pbr и отсутствуют депицы 4) метаданные колеса не допрошены должным образом по вашей комбинации pip/setuptools.

У нас есть жесткое требование для setuptools 17.1, и это было только явно сообщено setup.py совсем недавно. Мне бы это понравилось, если вы можете понять, какой из них имеет значение, и обновить https://github.com/testing-cabal/mock/issues/298, чтобы мы могли исправить любое взаимодействие, ведущее к этому тихий отказ setup.py/wheels.

Ответ 4

В Mac OSX ранее установленная версия из шести блоков блокировала мою обновленную версию. Я проверил это, как ранее было предложено, выполнив следующее в моем интерпретаторе:

import six
six.__version__

Чтобы исправить это, я переместил файл:

mv/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.py 
/tmp/old_six.py

Это уже сказано в другом ответе на этом сайте, но я хотел бы предоставить более оптимизированный ответ.

Ответ 5

У меня изначально возникла проблема со старыми версиями и параметрами pip/setuptools, принадлежащими ОС. После того, как я установил pip вручную, например:

wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
sudo ln -s /usr/local/bin/pip /usr/bin/pip

И затем, установив последнюю версию pip, mock и six, у меня все еще была проблема, описанная выше. Оказывается, что у меня было шесть установленных дважды:

/usr/lib/python2.7/dist-packages/

и в

/usr/local/lib/python2.7/dist-packages/

После того как я удалил шесть из /usr/lib/, он работал нормально: rm /usr/lib/python2.7/dist-packages/*six*

Ответ 6

Я установил pipe 6 == 1.9.0 и получил новую версию. Кажется, что mock == 1.3.0 неправильно определяет версию из шести, что нужно для поддержки оберток.

Ответ 7

Другим решением является установка переменной среды PYTHONPATH для указания на установленные пакеты.

Установка моей переменной окружения в моей конфигурации bash, чтобы:

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

Разрешено запускать тесты в терминале (без удаления/переименования каких-либо библиотек и т.д.).

Однако при использовании PyCharm это было менее чем полезно, а не правильно импортировать эту переменную среды. Несмотря на то, что PyCharm показывал как включающие родительские переменные (с указанными в тех, которые были показаны при импорте), кажется, что этот импорт работал неправильно.

Вручную установить переменную окружения, указанную выше в конфигурации запуска PyCharm, разрешает это.

Я не уверен, что PyCharm перезаписывает переменную PYTHONPATH после импорта из переменных окружения системы или какой-либо другой обман, но это разрешило ошибку для меня.

Ответ 8

Хотя вы не используете виртуальную среду, например virtualenv, это, безусловно, отличный вариант использования. Благодаря песочнице установки Python и всех зависимостей для вашего проекта вы можете полностью исключить возможность взлома в глобальной/стандартной установке python, из-за чего возникает сложность/сложность.

Это то, что я использовал, когда получил wraps ошибку - requirements.txt содержит mock==2.0.0 и six==1.10.0:

cd <my_project>
virtualenv venv
source venv/bin/activate
sudo pip install -r requirements.txt

Не только это проще использовать, на мой взгляд, это также проще документировать для людей, которые могут захотеть запустить ваш код.