使用不同版本的python和virtualenvwrapper

时间:2011-06-19 10:55:26

标签: python virtualenvwrapper

我使用Macports在我的Mac上安装了各种版本的python。当我通过$ port select python python27选择了python 2.7时,virtualenvwrapper非常有效。

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

我检查了我的.profile,它将VIRTUALENVWRAPPER_PYTHON设置为/opt/local/bin/python,所以在我看来,无论我选择了哪个python,virtualenvwrapper都应该正常工作。

在切换python版本时,有什么想法会导致virtualenvwrapper生成.hook_loader错误吗?

5 个答案:

答案 0 :(得分:29)

我知道这在你的评论中已经解决了,但它只是mac,

甚至更多我认为正确的方法应该是将VIRTUALENVWRAPPER_PYTHON设置为您在命令行中使用的真实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无论我选择哪个python都应该工作

实际上是相反的 - virtualenv依赖于使用正确的python(以及随之而来的包),因此相应地设置python路径非常重要。

即使运行带有“#!/ bin / python”的py文件,一旦你被虚拟化,也可能会带来麻烦!

答案 1 :(得分:14)

这些都没有奏效。我在设置我的osx机器时首先安装了Python3,并且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实际上做了什么?它输出在PATH中找到的python可执行文件的目录:

$ 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可执行文件。

答案 2 :(得分:8)

确认使用两个同名的环境变量:

VIRTUALENVWRAPPER_PYTHON - virtualenvwrapper实用程序本身使用哪个Python版本。换句话说,哪个版本的Python执行virtualenvwrapper,就好像已经在virtualenvwrapper脚本文件的#!行中明确命名了Python版本。

VIRTUALENV_PYTHON - 创建新虚拟环境时virtualenv将安装哪个Python版本。等同于-p / --python命令行上的virtualenv选项。

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

有关如何在virtualenv中升级Python,请参阅https://stackoverflow.com/a/24724360/763269

答案 3 :(得分:2)

您可以显式选择python版本

mkvirtualenv -p python3 venvname

mkvirtualenv -p python2.7 venvname

答案 4 :(得分:-1)

你(OP)似乎已经用python2.7安装了virtualenv和virtualenvwrapper,而不是用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选择的python版本的符号链接(请与ls -l /opt/local/bin/python一起检查以确定)。