如何使用依赖性隔离来分发和部署Python 3代码

Cal*_*son 5 python deployment python-3.2

我对目前部署Python代码的方式不满意,我想知道是否有更好的方法.首先我会解释我在做什么,然后是缺点:

  • 当我开发时,我使用virtualenv进行依赖隔离并使用pip安装所有库.Python本身来自我的操作系统(Ubuntu)
  • 然后我将我的代码构建成一个".deb"debian包,其中包含我的源代码树和我的依赖项的pip包
  • 然后当我部署时,我重建virtualenv环境,源foo/bin/activate然后运行我的程序(在Ubuntu的新手下)

以下是问题:

  1. pip包非常大,并且显着增加了debian包的大小.这不是什么大不了的事,但这很烦人.
  2. 我每次部署时都必须构建所有的C库(PyMongo,BCrypt等).这需要一点时间(几分钟),在生产中执行这个CPU绑定工作有点蹩脚

这是我的约束:

  1. 必须适用于Python 3.最好是3.2
  2. 必须具有依赖性隔离
  3. 必须使用使用C的库(如PyMongo)

我听说过有关冻结的事情,但我无法让它发挥作用.Pypi中的cx_freeze似乎没有编译(至少在我的Python上).其他冻结实用程序似乎不适用于Python 3.我怎样才能更好地做到这一点?

Cal*_*son 1

Wheel可能是目前最好的方法。

在部署计算机上创建一个 virtualenv,并将一个wheel 以及任何依赖项(也构建为wheel)部署到该virtualenv。

这解决了以下问题:

  1. 对依赖项有单独的轮子意味着您不必重新部署未更改的依赖项,从而减少了部署工件的大小
  2. 构建大包(例如 lxml 或 scipy)可以在本地完成,然后将编译后的轮子推送到生产环境

此外,它与使用 C 的库配合得很好。