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

Использование различных версий python с virtualenvwrapper

У меня есть различные версии python, установленные на моем Mac с помощью Macports. Когда я выбрал python 2.7 через $ port select python python27, virtualenvwrapper работает отлично.

Но если я выберу другую версию python, то есть 2.6, virtualenvwrapper генерирует сообщение об ошибке: ImportError: Нет модуля с именем virtualenvwrapper.hook_loader

Я проверил мой .profile и установил VIRTUALENVWRAPPER_PYTHON на /opt/local/bin/python, поэтому мне кажется, что virtualenvwrapper должен работать независимо от того, какой питон я выбрал.

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

4b9b3361

Ответ 1

Я знаю, что это в значительной степени решено в ваших комментариях, но только для mac,

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

Чтобы убедиться, что вы можете сделать which python.

Собственно, вы даже можете сделать:

export VIRTUALENVWRAPPER_PYTHON=`which python`

В linux я делаю это в своем .bashrc, поэтому в целом, предполагая, что вы установили virtualenv и создали свою первую "виртуальную среду" virtualenv (как оригинал)

. virtualenv/bin/activate
export WORKON_HOME=$HOME/.virtualenvs # or whatever else you want
export VIRTUALENVWRAPPER_PYTHON=`which python`
export PROJECT_HOME=SOMETHING
source $HOME/virtualenv/bin/virtualenvwrapper.sh # or wherever else you got that installed

(и, кстати, вы написали:

Я проверил свой .profile и установил VIRTUALENVWRAPPER_PYTHON в /opt/local/bin/python, поэтому мне кажется, что virtualenvwrapper должен работать независимо от того, какой питон я выбрал

что фактически противоположно - virtualenv полагается на использование правильного python (и пакетов, которые идут с ним), поэтому очень важно установить путь python соответствующим образом.

Даже запуск файла py с помощью "#!/bin/python" может привести к возникновению проблемы после того, как вы будете виртуальными!

Ответ 2

Ничего из этого не получилось. Сначала я устанавливал Python3 при настройке моей операционной системы osx, а pip и все по умолчанию.

Сначала проверьте, какой python вы установили:

$ `which python` -V

Если это возвращает "Python 2.7.12", то вы должны запустить:

$ mkvirtualenv -p `which python` api_server
Running virtualenv with interpreter /usr/local/bin/python
New python executable in /Users/eric/.virtualenvs/api_server/bin/python2.7
Also creating executable in /Users/eric/.virtualenvs/api_server/bin/python
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/predeactivate
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/postdeactivate
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/preactivate
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/postactivate
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/get_env_details

Это также активирует рабочий стол api_server, который изменяет исполняемый файл python:

$ which python
/Users/eric/.virtualenvs/api_server/bin/python
$ python -V
Python 2.7.12

Что делает which python на самом деле? Он выводит каталог исполняемых файлов python, найденных в вашем PATH:

$ which python
/usr/local/bin/python

Используя which python, вы в основном передаете /usr/local/bin/python в параметр -p в каталоге mkvirtualenv.

Что произойдет, если в which python есть более одного исполняемого файла python? Просто найдите тот, который вы хотите, и передайте его:

$ mkvirtualenv -p /usr/local/bin/python3 api_server

И virtualenvwrapper в конечном итоге будет использовать этот исполняемый файл python.

Ответ 3

Подтверждено использование двух одноименных переменных среды:

VIRTUALENVWRAPPER_PYTHON - какая версия Python используется самой утилитой virtualenvwrapper. Другими словами, какая версия Python выполняет virtualenvwrapper, как если бы эта версия Python была явно названа в #! строка файла сценария virtualenvwrapper.

VIRTUALENV_PYTHON - какая версия Python будет установлена virtualenv при создании новой виртуальной среды. Эквивалентно -p / --python в командной строке virtualenv.

И, возможно, очевидно :) версия Python, запускаемая в виртуальной среде, - это версия, которую вы устанавливаете для этой среды - она не имеет отношения к указанным выше переменным среды после создания env.

См. fooobar.com/questions/3158/... чтобы узнать, как обновить Python в virtualenv.

Ответ 4

Вы можете выбрать версию Python явно

mkvirtualenv -p python3 venvname

или же

mkvirtualenv -p python2.7 venvname

Ответ 5

Кажется, что вы (OP) установили virtualenv и virtualenvwrapper с python2.7, а не с python2.6. Если python2.6 вызывается в тот момент, когда ваша оболочка загружает virtualenvwrapper.sh script, это несчастливо. Довольно просто.

VIRTUALENVWRAPPER_PYTHON выполняется для этих ситуаций. С его помощью вы можете всегда использовать правильную версию python и не должны всегда добавлять это -p /path/to/python2.7

Итак, я не согласен с ответом Стефано в этом случае, в ситуации с ОП, вы должны были четко объяснить в своем .bashrc, какой python использовать:

...
export VIRTUALENVWRAPPER_PYTHON=/path/to/your/python2.7
source /path/to/bin/virtualenvwrapper.sh

Как будто все должно быть хорошо! Virtualenvwrapper выполняется для упрощения.

Также обратите внимание, что /opt/local/bin/python должна быть символической ссылкой на версию python, которую вы выбираете, с помощью port python select (убедитесь, что с помощью ls -l /opt/local/bin/python).