使用不同版本的python与virtualenvwrapper

问题描述:

我已经有不同版本的python使用Macports安装在我的Mac上。当我通过$ port select python python27选择python 2.7时,virtualenvwrapper完美运行。使用不同版本的python与virtualenvwrapper

但如果我选择蟒蛇的另一个版本,即2.6,virtualenvwrapper生成一条错误消息:导入错误:没有模块名为virtualenvwrapper.hook_loader

我检查了我的.profile文件,它的设置VIRTUALENVWRAPPER_PYTHON/opt/local/bin/python,所以它似乎我virtualenvwrapper应该工作,不管我选择了哪个python。

任何想法当我切换python版本会导致virtualenvwrapper生成一个.hook_loader错误?

+8

没有通过'端口选择...'并坚持你的基地2.7,只是运行'mkvirtualenv --python/path/to/python2.6'工作? 它应该自动切换到(并设置环境)正确的解释器。在我的系统上(设置自制软件),'mkvirtualenv -p python2.6'正常工作。 –

+0

我没有得到hook_loader错误,但它抱怨缺少DEST_DIR $ mkvirtualenv --python /opt/local/bin/python2.7 运行virtualenv时带有解释器/opt/local/bin/python2.7 您必须提供一个DEST_DIR – wmfox3

+1

哎呀,对不起 - 忽略了关键的论点!这应该是'mkvirtualenv --python /path/to/python2.6 env_name'。 mkvirtualenv在你的'$ WORKON_HOME'中创建一个名为“env_name”的文件夹,并将其作为'DEST_DIR'参数传递给virtualenv。如果没有指定名称,那么很难确定设置的位置,这是肯定的。 –

我知道这是你的意见几乎解决了,但它仅适用于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 

(顺便说一句,你写道:

I checked my .profile and it's setting VIRTUALENVWRAPPER_PYTHON to /opt/local/bin/python, so it seems to me virtualenvwrapper should work regardless of which python I've selected

WHI ch实际上是相反的 - virtualenv依赖于使用正确的python(以及与之一起使用的包),所以相应地设置python路径非常重要。

即使运行一个带有“#!/ bin/python”的py文件,一旦你使用virtualenved,可能会带来麻烦!

+4

在我的Mac上运行一些测试 - 看起来'VIRTUALENVWRAPPER_PYTHON'只控制'virtualenvwrapper'自己使用哪个Python可执行文件,而不是安装到虚拟环境中的可执行文件,例如当你运行'mkproject'时。我很想做错,但到目前为止,似乎选择不同的Python版本的唯一方法是在'virtualenvwrapper'命令行中使用'-p/--python'。如果那是真的,那真是一种耻辱。 –

+0

@ChrisJohnson mmmh从那时起我停止使用virtualenvwrapper - 没有找到太多的需求 - 我没有简单的方法来快速复查,但你可能确实是正确的...另外在MAC上我现在使用brew ... – Stefano

+0

same作为@ChrisJohnson在Ubuntu上。我的'VIRTUALENVWRAPPER_PYTHON'设置为python2,但'mkvirtualenv'正在用python3创建virtualenvs。 –

你(OP)似乎已经安装了virtualenv和virtualenvwrapper与python2.7,而不是与python2.6。如果在您的shell加载virtualenvwrapper.sh脚本时调用python2.6,那么它会很不愉快。非常简单。

VIRTUALENVWRAPPER_PYTHON是针对这些情况制作的。有了它,你可以确保你总是使用正确的python版本,并且不必总是添加-p /path/to/python2.7

所以,我不同意Stefano在这种情况下的回答,在OP的情况下,你应该已经清楚地在你的.bashrc中使用了哪些python:

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

这样就应该一直都可以! Virtualenvwrapper是为了简化事情而完成的。

此外,请注意,/opt/local/bin/python必须是与port python select(请确保与ls -l /opt/local/bin/python确定)选择的python版本的符号链接。

+2

我想强调的是,如果你有分层的终端阻止你设置一个环境变量(如我),使用-p标志是一个解决方案。 mkvirtualenv -p/usr/bin/python3 Foo – htmldrum

确认使用两个名称类似的环境变量:

VIRTUALENVWRAPPER_PYTHON - 它的Python版本所使用的virtualenvwrapper实用程序本身。

VIRTUALENV_PYTHON - 当您创建新的虚拟环境时,将通过virtualenv安装哪个Python版本。相当于virtualenv命令行上的-p/--python选项。

也许很明显:)在虚拟环境中运行的Python版本是您为其安装的版本 - 在env创建后与上述环境变量无关。

请参阅https://*.com/a/24724360/763269了解如何在virtualenv中升级Python。

这些都没有工作。我在安装我的OSX机器时首先安装了Python3,并且所有的默认都是pip。

首先,检查哪些Python中,你已经安装:

$ `which python` -V 

如果返回 “巨蟒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 workon,它改变你的python可执行文件:

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

是什么其实呢?它输出在PATH中发现的蟒蛇可执行文件的目录:

$ which python 
/usr/local/bin/python 

使用which python,你基本上传递/usr/local/bin/python在mkvirtualenv目录-p选项。

当您在which python中返回多个python可执行文件时会发生什么?只要找到一个你想要的,并传递它:

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

而且virtualenvwrapper最终会使用Python的可执行文件来代替。