通过 virtualenvwrapper 使用不同版本的 python

问题描述 投票:0回答:6

我使用 Macports 在我的 Mac 上安装了各种版本的 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 都应该工作。

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

python virtualenvwrapper
6个回答
63
投票

您可以明确选择python版本

mkvirtualenv -p python3 venvname

mkvirtualenv -p python2.7 venvname

37
投票

我知道这个问题在你的评论中已经基本解决了,但它仅限于 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,所以在我看来,无论我选择哪个 python,virtualenvwrapper 都应该工作

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

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


18
投票

这些都不起作用。我在设置 osx 机器时首先安装了 Python3,并且 pip 和 all 默认安装的。

首先,检查你安装了哪个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 可执行文件。


11
投票

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

VIRTUALENVWRAPPER_PYTHON
——virtualenvwrapper 实用程序本身使用哪个 Python 版本。换句话说,哪个版本的 Python 执行
virtualenvwrapper
,就好像该 Python 版本已在 virtualenvwrapper 脚本文件的
#!
行中显式命名。

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

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

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


0
投票

要将多个版本的 python 与 virtualwrapper 一起使用,您需要重新安装该新版本的 virtualwrapper 及其相应的 pip 管理器。

假设您刚刚安装了 Python-3.12.0,那么您需要在终端中安装

sudo pip3.12 install virtualenv virtualenvwrapper

然后您可以继续使用不同的 python 版本创建环境

mkvirtualenv sexyspace -p python3.12
workon sexyspace
python

请注意,只要我输入 python,它就会加载正确的 python 版本。您也可以在环境中正常地

pip install
,因为它知道它必须在内部使用pip3.12


-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
检查以确保)。

© www.soinside.com 2019 - 2024. All rights reserved.