使用virtualenvwrapper管理不同版本的Python

60 投票
6 回答
90958 浏览
提问于 2025-04-16 19:51

我在我的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应该都能正常工作。

有没有人知道为什么在我切换Python版本时,virtualenvwrapper会出现.hook_loader的错误呢?

6 个回答

18

这些方法都没用。我在设置我的mac电脑时,先安装了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到底是干嘛的呢?它会输出你在系统路径中找到的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可执行文件了。

65

你可以明确选择你想要的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文件,一旦你进入虚拟环境,也可能会遇到麻烦!

撰写回答