前提

       在开发过程中,经常需要使用各种第三方库,而且python又提供了pip,easy_install等工具来简化库的安装,所以很容易就会在系统python的site-packages目录中装满各种各样的库,但是这样在下面几种情况下会有问题:

1
2
3
1.没有site-packages目录的写权限,比如共享主机
2.不同项目依赖同一个库的不同版本,而这两个版本又不向下兼容
3.在linux下更新系统时,自动更新某些依赖库

解决

       这时候我们就需要一个我们可以自己创建python环境的工具,它要满足如下条件:

1
2
3
4
1.我们可以指定环境的位置,这样就可以将其安装在自己有权限的目录
2.可以创建多个环境,这样不同项目可以使用不同环境,即使依赖同一个库的
  不同版本也不会有影响
3.系统自动更新时,系统python的site-packages中库的更新不会对自己项目造成影响

       virtualenv就是这样一个工具,它可以在指定位置创建一个拥有独立安装目录的python环境,该隔离环境不会与其他virtualenv环境共享模块。它的具体用法可以参考这里,使用virtualenv来创建独立的环境还有一个好处,它可以和pip结合快速创建项目环境。

1
2
3
4
# 导出当前环境下的所有第三方库
pip freeze > requirements.txt
# 在新环境下安装所有文件内的第三方库

pip install -r requirements.txt

***************************************************************
virtualenv用于创建独立的Python环境,多个Python相互独立,互不影响,它能够:
1. 在没有权限的情况下安装新套件
2. 不同应用可以使用不同的套件版本
3. 套件升级不影响其他应用
安装
sudo apt-get install python-virtualenv
使用方法
virtualenv [虚拟环境名称] 

如,创建**ENV**的虚拟环境
virtualenv ENV
默认情况下,虚拟环境会依赖系统环境中的site packages,就是说系统中已经安装好的第三方package也会安装在虚拟环境中,如果不想依赖这些package,那么可以加上参数 --no-site-packages建立虚拟环境
virtualenv --no-site-packages [虚拟环境名称]
启动虚拟环境
cd ENV
source ./bin/activate
注意此时命令行会多一个(ENV),ENV为虚拟环境名称,接下来所有模块都只会安装到该目录中去。
退出虚拟环境
deactivate
在虚拟环境安装Python套件
Virtualenv 附带有pip安装工具,因此需要安装的套件可以直接运行:
pip install [套件名称]
如果没有启动虚拟环境,系统也安装了pip工具,那么套件将被安装在系统环境中,为了避免发生此事,可以在~/.bashrc文件中加上:
export PIP_REQUIRE_VIRTUALENV=true
或者让在执行pip的时候让系统自动开启虚拟环境:
export PIP_RESPECT_VIRTUALENV=true
Virtualenvwrapper
Virtaulenvwrapper是virtualenv的扩展包,用于更方便管理虚拟环境,它可以做:
1. 将所有虚拟环境整合在一个目录下
2. 管理(新增,删除,复制)虚拟环境
3. 切换虚拟环境
4. ...
安装
sudo easy_install virtualenvwrapper  

此时还不能使用virtualenvwrapper,默认virtualenvwrapper安装在/usr/local/bin下面,实际上你需要运行virtualenvwrapper.sh文件才行,先别急,打开这个文件看看,里面有安装步骤,我们照着操作把环境设置好。
创建目录用来存放虚拟环境
mkdir $HOME/.virtualenvs
在~/.bashrc中添加行: export WORKON_HOME=$HOME/.virtualenvs
在~/.bashrc中添加行:source /usr/local/bin/virtualenvwrapper.sh
运行: source ~/.bashrc
此时virtualenvwrapper就可以使用了。
列出虚拟环境列表
workon
也可以使用
lsvirtualenv
新建虚拟环境
mkvirtualenv [虚拟环境名称]
启动/切换虚拟环境
workon [虚拟环境名称]
删除虚拟环境
rmvirtualenv [虚拟环境名称]
离开虚拟环境
deactivate