使用不同版本的python和virtualenvwrapper

wmf*_*ox3 31 python virtualenvwrapper

我使用Macports在我的Mac上安装了各种版本的python.当我选择python 2.7 via时$ port select python python27,virtualenvwrapper工作得很好.

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

我检查了我的.profile并且设置VIRTUALENVWRAPPER_PYTHON/opt/local/bin/python,所以在我看来virtualenvwrapper应该工作,无论我选择了哪个python.

知道什么会导致virtualenvwrapper在切换python版本时生成.hook_loader错误吗?

Ste*_*ano 30

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

甚至更多我认为正确的方法应该是设置VIRTUALENVWRAPPER_PYTHON你在命令行使用的真正的python.

确保你能做到which python.

实际上,你甚至可以这样做:

export VIRTUALENVWRAPPER_PYTHON=`which python`
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

(顺便说一下,你写道:

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

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

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

  • 在我的Mac上运行一些测试 - 看起来`VIRTUALENVWRAPPER_PYTHON`只控制`virtualenvwrapper`本身使用的Python可执行文件,而不是安装到虚拟环境中的可执行文件,例如当你运行`mkproject`时.我希望是错的,但到目前为止,选择不同的Python版本的唯一方法是在`virtualenvwrapper`命令行中使用`-p/--python`.如果这是真的,那真是一种耻辱. (4认同)

edu*_*911 18

这些都没有奏效.我在设置我的osx机器时首先安装了Python3,而pip和默认都是默认的.

首先,检查你安装了哪个python:

$ `which python` -V
Run Code Online (Sandbox Code Playgroud)

如果返回"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
Run Code Online (Sandbox Code Playgroud)

这也将激活api_serverworkon,它会改变你的python可执行文件:

$ which python
/Users/eric/.virtualenvs/api_server/bin/python
$ python -V
Python 2.7.12
Run Code Online (Sandbox Code Playgroud)

什么是which python真正做到?它输出在PATH中找到的python可执行文件的目录:

$ which python
/usr/local/bin/python
Run Code Online (Sandbox Code Playgroud)

通过使用which python,您基本上是传递/usr/local/bin/python-pmkvirtualenv目录中的选项.

当你有多个python可执行文件返回时会发生什么which python?找到你想要的那个并传递它:

$ mkvirtualenv -p /usr/local/bin/python3 api_server
Run Code Online (Sandbox Code Playgroud)

而virtualenvwrapper将最终使用该python可执行文件.


Dos*_*Dos 13

您可以显式选择python版本

mkvirtualenv -p python3 venvname
Run Code Online (Sandbox Code Playgroud)

要么

mkvirtualenv -p python2.7 venvname
Run Code Online (Sandbox Code Playgroud)


Chr*_*son 9

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

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

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

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

有关如何在virtualenv中升级Python,请参阅/sf/answers/1730705231/.