Использование различных версий 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?
Ответы
Ответ 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
).