让我们从一个无聊的小段子开始。

"What’s pip?"

"A python package manager"

"How do I install it?"

"easy_install pip"

"What’s easy_install?"

"A python package manager"

pip和easy_install都是python的包管理工具,类似于ruby的gem以及nodejs的npm。

而pip是easy_install的升级版,在这个页面中提到了pip对于easy_install的升级。其中提到了一点非常重要。

pip is complementary with virtualenv, and it is encouraged that you use virtualenv to isolate your installation.

如果有同学不熟悉virtualenv,这里是一个小小的介绍。(以下翻译来自:戳我

virtualenv 是一个创建隔离的Python环境的工具。

virtualenv要解决的根本问题是库的版本和依赖,以及权限问题。假设你有一个程序,需要LibFoo的版本1,而另一个程序需要版本2,如何同时使用两个应用程序呢?如果将所有的库都安装在 /usr/lib/python2.7/site-packages(或者你的系统的标准包安装路径),非常容易出现将不该升级的库升级的问题。

另外,在一台共享的机器上,如果没有全局的 site-packages 目录的权限(例如一个共享的主机),如何安装Python库呢?

在这些情况下,就是该用到virtualenv的地方。它能够创建一个自己的安装目录,形成一个独立的环境,不会影响其他的virtualenv环境,甚至可以不受全局的site-packages当中安装的包的影响

由于virtualenv的以上优点。我们使用pip与virtualenv配合,可以很轻松保证线上线下运行环境一致,实现自动化部署。

举一个例子。

在线下开发时,我们使用virtualenv env创建一个Python虚拟环境。并使用source env/bin/activate激活。

然后我们可以在这个虚拟环境中安装我们需要的包。此时我们的环境与全局完全隔离,所有Python运行环境只以来于现有的虚拟环境。

在部署服务时,拷贝整个虚拟环境必然是不明智的选择。我们使用pip freeze > requirements.txt将本环境的依赖写入requirements.txt文件。

然后在线上新建env_online,激活之。并调用pip install -r requirements.txt,此时线上服务器会下载所有依赖包。在安装结束后,我们就克隆了线下的环境。

当然,如果线上服务器没有连接外网。我们可以使用离线方法安装需要的包。

pip bundle env.pybundle -r requirements.txt会重新下载所有依赖的包,并写入env.pybundle。然后我们将其上传到线上,使用pip install env.pybundle安装即可。

以上是pip和virtualenv配合使用一些技巧。参考自:戳我


Comments

comments powered by Disqus