使用virtualenvwrapper管理不同版本的Python
我在我的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 个回答
这些方法都没用。我在设置我的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可执行文件了。
你可以明确选择你想要的Python版本
mkvirtualenv -p python3 venvname
或者
mkvirtualenv -p python2.7 venvname
我知道这个问题在评论里基本上已经解决了,但这只适用于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文件,一旦你进入虚拟环境,也可能会遇到麻烦!