在《Django最佳实践与部署》一文中我曾提到过用virtualenv创建虚拟环境的好处。今天将结合virtualenvwrapper—virtualenv的终极伴侣,来具体谈一谈如何利用虚拟环境提高开发效率。
为什么要使用virtualenv和virtualenvwrapper
作为一个完美主义者,不喜欢看到系统site-packages
放着各种各样Python包。很多包只是因为某个项目需要,而根本没有必要放在全局。我喜欢virtualenv这种相互独立环境的概念,就好像有很多房间,每个房间可以有不同装饰,拥有自己个性。
virtualenv安装
$ pip install virtualenv
创建环境
$ virtualenv ENV # 创建名为‘ENV‘的虚拟环境$ New python executable in ENV/bin/python$ Installing setuptools, pip...done.
这样就成功创建好一个python的虚拟环境,实际上他为你建立了三个目录:
bin include lib
这里面包含一个Python环境(默认为系统Python的版本),一些基本工具(如easy_install和pip)以及一些symbolic link。而以后的package都会装到lib/pythonX.X/site-packages
里面。
激活环境
使用虚拟环境之前必须激活,不然package还是会装到系统的site-packages
里面。
$ source bin/activate
激活成功后,prompt左边会出现一个括号,里面对应就虚拟环境的名字。这个时候就代表激活成功了,而此时用pip安装任何包都会装到虚拟环境的site-packages
,对其他项目和系统Python环境都完全不影响。
注销环境
如果想退出虚拟环境,也很简单。
$ deactivate
更多设置
请参考virtualenv的官方文档
virtualenvwrapper
当virtualenv上手之后,我觉得效率提高很多。可是随着虚拟环境数目增多又遇到一个问题。每次切换环境的过程显得非常繁琐:deactivate
一个环境,cd到另外一个目录,source bin/activate
。virtualenvwrapper正是为了解决这个问题出现:集中管理多个虚拟环境,快速切换。(支持tab completion!)
下面用一个动图来显示它的强大。(假设我现在有两个环境:demo_env1
和demo_env1
)
安装 & 设置
同样使用pip安装
$ pip install virtualenvwrapper
环境变量设置。把下面几行加入.bashrc
或.bash_profile
export WORKON_HOME=$HOME/.virtualenvs # 放所有虚拟环境的地方export PROJECT_HOME=$HOME/Devel # 放所有项目的地方source /usr/local/bin/virtualenvwrapper.sh
使用
mkvirtualenv
命令创建一个新的虚拟环境
$ mkvirtualenv mynewenvNew python executable in mynewenv/bin/pythonInstalling distribute.................................................................................................................................................................................done.(mynewenv)$ workonmynewenv(mynewenv)$
这样会在WORKON_HOME
也就是默认的~/.virtualenvs
下创建一个名为mynewenv
的virtualenv。我不喜欢这种工作模式,因为对于一个把所有项目都放在单独一个目录的人来说(比如~/Projects
),我不想让virtualenvwrapper
打破原有的习惯。还好virtualenvwrapper
提供了不错的项目管理功能。
$ mkproject mynewnenvNew python executable in mynewnenv/bin/pythonInstalling setuptools, pip...done.Creating ~/Devel/mynewnenvSetting project for mynewnenv to ~/Devel/mynewnenv(mynewnenv)~
这样会在WORKON_HOME
创建虚拟环境,在PROJECT_HOME
创建项目目录。这正是我想要的效果:所有的虚拟环境在一处(WORKON_HOME
),所有的项目在另一处(PROJECT_HOME
)。pip安装的时候会将所有包装到当前激活的虚拟环境中,就实现了看似分离,实际又是统一的效果。
为已有项目添加虚拟环境
为已存在项目添加虚拟环境也十分容易。(当然前提是已经创建好待添加的虚拟环境才可以绑定)
$ setvirtualenvproject ~/.virtualenvs/mynewenv ~/Devel/myprojectSetting project myproject to ~/Devel/myproject$ workon myproject(myproject)~
其他常用命令(全部支持tab completion) workon
切换到环境 deactivate
注销当前环境 lsvirtualenv
列出所有环境 rmvirtualenv
删除环境 cpvirtualenv
复制环境 cdsitepackages
cd到当前环境的site-packages
目录 lssitepackages
列出当前环境中site-packages
内容 setvirtualenvproject
绑定现存的项目和环境 wipeenv
清除环境内所有第三方包扩展
virtualenvwrapper
提供了几个template
以供我们初始化新的项目:
virtualenvwrapper.bitbucket virtualenvwrapper.django virtualenvwrapper.github
这里详细介绍一下virtualenvwrapper.github
,因为我对这个项目小有贡献。这个插件的作用是,当创建一个virtualenvwrapper
的项目的时候,可以从指定的Github位置导入初始代码。
安装
可以通过
$ pip install virtualenvwrapper.github
来获取这个插件。但由于原作者没能继续维护这个项目,我建议直接用我的fork,下载github.py
,复制到site-packages
下的virtualenvwrapper
目录即可。
使用方法
首先确保这个repo的链接存在:git@github.com:your_github_username/my_repo.git
$ export VIRTUALENVWRAPPER_GITHUB_USER=your_github_username # 设置环境变量$ mkproject -t github my_repo
管理多Python环境之Virtualenv与Virtualenvwrapper was originally published by Liuyang Wan at 浏洋的博客 on April 04, 2014.
而更像是听见了天地间冥冥中的呼唤,