2015-07-14 2 views
23

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

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

фиктивный модуль говорит он совместим с питона 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 python -c 'from six import wraps' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
ImportError: cannot import name wraps 

ответ

30

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

Редактировать: Реальное решение для меня было до обновлено setuptools до последней версии, и это позволило мне обновить макет и шесть до последних. Я был на setuptools 3.3. В моем случае я также должен был удалить указанные модули вручную, потому что они принадлежали ОС в «/usr/local/lib/python2.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

Thats потому что mock 1.0.1 не зависит от шести. – lifeless

+0

ОК, поэтому я думаю, что это означает, что мы снова должны взглянуть на логику обработки минимальной версии. Я открою билет – lifeless

+2

hmm теперь у меня такая же проблема на моем Mac даже с последними версиями, поэтому я не уверен, что это значит. setuptools == 18.0.1, mock == 1.3.0, six == 1.9.0 – Michael

1

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

+0

Укажем 1.7 - https://github.com/testing-cabal/mock/blob/master/requirements.txt#L6 - который определяет обертки. Во всех отчетах, которые мы выкопали подробно, фактически были установлены некорректные ранее установленные установки из шести загружаемых. Приятно помочь вам отладить ваше дело больше, если вы можете предоставить некоторые детали. – lifeless

+0

@lifeless. Я почти уверен, что проблема в том, что у вас есть требование> =, поэтому, если каким-то образом в цепочке требований кто-то уже имеет старую версию из шести, < 1.9.0 but > = 1.7, она не будет работать должным образом, но если я * явно * версия его отдельно в моих требованиях, она установлена ​​в 1.9.0, которая, конечно же, удовлетворена. – Jordan

+0

Если вы устанавливаете проект X, который зависит от Y> = N, а Y = не проблема. Однако, если вы используете файл требований и уже указываете Y, то зависимость, которую имеет X, игнорируется. Получите мне транскрипцию того, что происходит, поэтому мы можем воспроизвести ее, и мы можем видеть, что происходит. – lifeless

4

так, макет 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) есть пакет distro six, претендующий на 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.

+0

Спасибо. Я вижу, что в этой конкретной коробке есть setuptools 3.3. Попытка обновить это, надеясь, что это проблема. – Michael

+0

Это, казалось, сработало, спасибо! – Michael

2

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

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*

18

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

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

и

/Library/Python/2.7/site-packages/ 

с бывшим раньше, чем последний.

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

import six 
six.__version__ 

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

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

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

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

Спасибо за это! Действительно помог! –

+0

Это должен быть принятый ответ! Это более разумно и логично, чем принятый ответ, написанный OP. И этот ответ работает. –

+1

Вы можете увидеть расположение пакета 'six', используя' six .__ file__' после 'import six' в консоли python. –

3

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

import six 
six.__version__ 

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

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

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

+0

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

+0

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

1

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

Настройка моего переменное окружения в моем Баше конфигурации, так что:

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

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

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

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

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

0

Хотя вы не используете виртуальную среду, например 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 

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

Смежные вопросы