使用Python进行开发时,我们需要在系统中安装Python以及所需要的第三方依赖包,依赖包通常都会被pip安装到Python的site-packages目录。如果经常使用Python进行开发,可能会遇到不同项目依赖于同一第三方包的不同版本。怎样才能高效的维护开发环境和管理第三方包呢?毕竟,我们希望项目有一个可以完全控制的隔离运行环境,在这个环境里我们可以控制安装哪些第三方依赖包,以及这些依赖包的什么版本应该被安装。同时,我们可以在这个隔离环境里升级任意的第三方依赖包,并且不会影响到其它项目。

Virtual Environment的使用

Python提供了一个非常方便的工具来维护运行环境和管理依赖包,这个工具就是Virtual Environment。它能够帮我们为每一个项目构建一个隔离的运行环境。Virtual Environment的安装和使用也非常简单,我们只需要运行下面命令就可以使用pip安装Virtual Environment。

pip install virtualenv

完成安装以后,开始一个Python项目时我们可以使用virtualenv命令为这个项目创建一个隔离的环境,这里假如我们的项目名为Spider。

mkdir Spidercd Spidervirtualenv Spider -p python3

“-p python3”指定了我们的运行环境使用的是Python3。如果我们再加上了参数“--no-site-packages”,已经安装到系统Python环境中的所有第三方包都不会复制到我们创建的环境。一个不带任何第三方包的Python运行环境被创建起来。






接下来,我们可以激活Virtual Environment,Python程序就运行在这个隔离的Python环境里了。在Windows和类Linux下激活命令稍微有一点不同。

Linux系统:

source Spider/bin/activate

Windows系统:

.SpiderScriptsactivate

如果没有什么意外,我们可以看见(Spider)出现在我们的命令行前面。这表明我们正工作在Spider的虚拟环境里,所有依赖和其它项目是隔离的。

我们可以通过pip安装指定的第三方包到当前环境。这里假设我们要安装我们爬虫系列文章里用到过的BeautifulSoup 4.3.2到当前Spider环境中。

pip install beautifulsoup4==4.3.2

我们可以通过下面命令列出所有当前环境安装的第三方包。

pip freeze

我们也可以把标准输出的第三方包保存到文件requirements.txt中。

pip freeze > requirements.txt

我们可以通过下面命令退出当前虚拟环境。

deactivate

当我们切换到一台新的开发机或者是项目的其它开发者可以创建新的运行环境,并只需要简单的运行下面命令就可以得到一个和前面有完全一样安装包的虚拟环境。

pip install -r requirements.txt

最后,在这个虚拟环境里我们也可以独立的升级软件包。

pip install --upgrade beautifulsoup4

我们可以看到,即使是在同一台机器上也只有这一个虚拟环境里的beautifulsoup4被升级了,其它环境里依然是4.3.2。






Virtual Environment的原理

当我们输入Python时,操作系统之所以能够找到并运行我想我们安装的Python,是因为环境变量存储了一个目录列表。操作系统从这个目录下寻找Python。

当我们创建一个新虚拟环境的时候,需要的Python解释器和相关的第三方包会被拷贝到虚拟环境所在的目录。即使是系统的Python解释器或者是第三方包被升级了,虚拟环境的版本依然会保存不变。

当我们激活一个虚拟环境里时,虚拟环境所作的就是替换环境变量,保证找到的Python解释器和第三方包是安装在虚拟环境里的。

当我们在激活的虚拟环境里使用pip安装或升级第三方包时,所有的改动都是被保存到当前虚拟环境中python的site-packages目录。

了解了虚拟环境的运行原理后,如果我们遇到任何不是通过pip安装的python包(如PyQt4),我们也可以先安装到系统,然后在拷贝到虚拟环境中对应的目录。这样可以使这个包也和系统中的隔离开来。