安装 virtualenv
virtualenv是将Python的实际运行环境进行虚拟的工具包。
使用pip install命令安装的功能包,均会存放在/usr/local/lib/python2.7目录下。一旦安装了各种各样的功能包,当我们想让不同的Python应用程序在同一个环境开发时,就会发现自己根本分不清哪个包对应哪个应用程序。virtualenv就是在这样的情况下,对多种不同的Python运行环境进行管理的一个工具。
安装virtualenv
$ pip install virtualenv
安装virtualenv之后,使用help命令
$ virtualenv --helpVirtualenv的使用方法
使用pip freeze确认已经安装好的所有包的版本信息,当输入命令后,可看到所有包的清单,这些就是已经安装在/usr/local/lib/python2.7下的所有包的信息。
$ pip freeze
接着,用virtualenv创建一个供新开发的Python应用程序运行的虚拟环境。先在home目录下建立一个工作目录,在该目录中建立一个虚拟运行环境。
使用virtualenv建立虚拟运行环境,会在work目录下建立一个新的env目录,这就是虚拟环境目录。
$ export VIRTUALENV_USE_DISTRIBUTE=true $ mkdir ~/work $ cd ~/work $ virtualenv env
VIRTUALENV_USE_DISTRIBUTE是向Distribute明示Python运行信息的环境变量(即发布Python应用时,告知虚拟环境中相关的运行信息)。如果在开发过程中,希望所开发的Python应用程序有“不兼容旧版本的Python”或者“兼容最新版本Python”的要求,最好对该环境变量进行设定。为了不在每次登录都输入这样的命令,我们可以在登录的shell配置中加入下面的这条语句。
$ export VIRTUALENV_USE_DISTRIBUTE=true
Distribute会根据这个环境变量是否存在,判断虚拟运行环境的配置有效或无效。因此在不适用Distribute的时候,建议用unset命令取消该环境变量。
NOTE:
virtualenv的默认设置是创建虚拟运行环境时不使用/usr/local/lib/python2.7/site-packages下的模块或者包。相反,当我们需要使用系统下的模块或者包来创建虚拟运行环境的话,可以使用--system-site-packages选项:$ virtualenv --system-site-packages env
--system-site-packages是在virtualenv版本1.7之后添加的,包括1.6在内的之前版本都默认使用系统下的模块或者包来创建虚拟运行环境。因此,如果在1.6以前的版本下建立最小虚拟运行环境,可以使用--no-site-packages选项。
$ virtualenv --no-site-packages env
虚拟运行环境激活,当使用了source命令后,虚拟运行环境信息开始生效。
$ source env/bin/activate
virtualenv被激活的状态
(env) :~/work$
当虚拟运行环境被激活后,再一次使用pip freeze命令来检查安装好的包版本信息。
检查安装好的包版本信息
(env) $ pip freeze
如此以来,很容易把握在开发Python应用程序时需要安装的包和模块,从而尽可能减少其他不相关包和模块给应用程序开发带来的未知影响。
退出虚拟运行环境
(env) $ deactivate
当使用virtualenv建立虚拟运行环境来开发应用程序时,千万不要忘了先激活虚拟运行环境。当不再需要该虚拟环境时(这里值名为env的虚拟环境),可以直接使用rm等命令将对应的目录删除。
在虚拟环境安装Python套件
Virtualenv 附带有pip安装工具,因此需要安装的套件可以直接运行:
pip install [套件名称]
进入虚拟环境后,先执行which pip,确认pip是在虚拟环境下的。
如果系统系统环境下已经安装了该套件,则虚拟环境将不会被安装。
如果想在虚拟环境下安装该套件(而系统环境上已安装了该套件),只有先从系统环境卸载该套件后,删除系统环境目录/usr/lib/python2.7/dist-packages下的相应包文件夹,再在虚拟环境重新安装该套件。
如果没有启动虚拟环境,系统也安装了pip工具,那么套件将被安装在系统环境中。
为了避免发生此事,可以在~/.bashrc文件中加上:
export PIP_REQUIRE_VIRTUALENV=true
或者让在执行pip的时候让系统自动开启虚拟环境:
export PIP_RESPECT_VIRTUALENV=true