使用virtualenvwrapper管理不同版本的Python

57
我在Mac上使用Macports安装了多个Python版本。当我通过命令 $ port select python python27 选择Python 2.7时,virtualenvwrapper可以正常工作。
但是,如果我选择另一个Python版本,比如2.6,virtualenvwrapper将会生成一个错误信息:ImportError: No module named virtualenvwrapper.hook_loader。
我检查了我的.profile文件,并且它将 VIRTUALENVWRAPPER_PYTHON 设置为 /opt/local/bin/python。因此,无论我选择哪个Python版本,Virtualenvwrapper看起来都应该能够正常工作。
有什么想法会导致Virtualenvwrapper在切换Python版本时生成一个.hook_loader错误吗?

12
不进行“port select…”操作,保持您的基本2.7版本,只运行“mkvirtualenv --python /path/to/python2.6”是否可行?这样做应该会自动切换并设置正确的解释器环境。在我的系统上(使用homebrew设置),“mkvirtualenv -p python2.6”可以正常工作。 - Greg Haskins
我没有遇到hook_loader错误,但它抱怨缺少DEST_DIR $ mkvirtualenv --python /opt/local/bin/python2.7 使用解释器/opt/local/bin/python2.7运行虚拟环境 您必须提供一个DEST_DIR - wmfox3
2
糟糕,抱歉——我漏掉了关键参数!应该是 mkvirtualenv --python /path/to/python2.6 env_name。mkvirtualenv 会在 $WORKON_HOME 中创建一个名为 "env_name" 的文件夹,并将其传递给 virtualenv 作为其 DEST_DIR 参数。如果不指定名称,它肯定很难确定在哪里设置事情。 - Greg Haskins
我应该注意到那个的。是的,可以了。看来答案是将端口选择留给python27,并在需要使用其他内容时使用--python标志运行mkvirtualenv。 - wmfox3
5个回答

63
你可以明确选择Python版本。
mkvirtualenv -p python3 venvname
mkvirtualenv -p python2.7 venvname

1
非常适合在单个开发机器上轻松运行多个不同的环境。 - Stringers
我如何确保创建的虚拟环境安装了正确的Python? 如果我执行 which python 命令,会得到以下结果:/home/USER/.virtualenvs/venvname/bin/python - desmond13
@desmond13 输入 workon venvnamepython3 --version,这将显示正在使用的 python3 版本。 - bieboebap

37

我知道你的评论已经解决了这个问题,但它只适用于Mac操作系统,

而且更正确的方法应该是将VIRTUALENVWRAPPER_PYTHON设置为你在命令行中使用的实际python。

你可以通过执行which python来确保。

实际上,你甚至可以执行以下操作:

export VIRTUALENVWRAPPER_PYTHON=`which python`

在Linux上,我会在我的.bashrc文件中这样做,所以总体来说,假设您已经安装了virtualenv并创建了第一个"虚拟环境" virtualenv (多么原始)

在Linux上,我会在我的.bashrc文件中添加以下内容,这样做可以使您的"虚拟环境" 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 文件也可能会在你开启虚拟环境后出现问题!

)

5
在我的 Mac 上运行了一些测试,似乎 VIRTUALENVWRAPPER_PYTHON 只控制 virtualenvwrapper 自身使用的 Python 可执行文件,而不是安装到虚拟环境中的可执行文件,例如当您运行 mkproject 时。我很希望我错了,但目前看来选择不同的 Python 版本的唯一方法似乎是在 virtualenvwrapper 命令行中使用 -p / --python。如果这是真的,那就有点遗憾了。 - Chris Johnson
@ChrisJohnson 自那以后我停止使用 virtualenvwrapper - 发现不再需要它 - 我没有快速双重检查的简单方法,但你可能是正确的... 另外在 MAC 上我现在使用 brew... - Stefano
和 @ChrisJohnson 在 ubuntu 上一样。我的 VIRTUALENVWRAPPER_PYTHON 设置为 python2,但是 mkvirtualenv 却创建了带有 python3 的虚拟环境。 - Eduard Luca

18

这些方法都没有起作用。在设置我的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
< p >"which python"的实际作用是什么?它输出在您的PATH中找到的python可执行文件的目录:

$ which python
/usr/local/bin/python

通过使用which python命令,你基本上是将/usr/local/bin/python传递给mkvirtualenv目录中的-p选项。
当你有多个Python可执行文件返回到which python时会发生什么?只需找到想要的那一个并传递即可。
$ mkvirtualenv -p /usr/local/bin/python3 api_server

virtualenvwrapper最终会使用该Python可执行文件。


11

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

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

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

很显然 :) 在虚拟环境中运行的Python版本是您为该环境安装的版本 - 与上述环境变量之间没有关系。

参见https://dev59.com/Pmkv5IYBdhLWcg3w91lG#24724360以了解如何在virtualenv中升级Python。


-1

你(OP)似乎已经使用Python2.7安装了virtualenv和virtualenvwrapper,而不是Python2.6。如果在加载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 来检查)。


2
我想强调,如果您遇到分层终端防止设置环境变量(就像我一样),那么使用-p标志是一种解决方案。mkvirtualenv -p /usr/bin/python3 Foo - htmldrum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接