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

时间:2012-11-27 21:40:53

标签: 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绑定作业有点蹩脚
  3. 以下是我的约束:

    1. 必须使用Python 3.最好是3.2
    2. 必须具有依赖性隔离
    3. 必须使用使用C的库(如PyMongo)
    4. 我听说过有关冻结的事情,但我无法让它发挥作用。 Pypi中的cx_freeze似乎没有编译(至少在我的Python上)。其他冻结实用程序似乎不适用于Python 3.我怎样才能做得更好?

2 个答案:

答案 0 :(得分:1)

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

在部署机器上创建virtualenv,并将轮子以及任何依赖项(也构建为轮子)部署到该virtualenv。

这解决了问题:

  1. 为依赖项设置单独的轮子意味着您不必重新部署未更改的依赖项,从而减少部署工件的大小
  2. 构建大包(例如lxml或scipy)可以在本地完成,然后编译的轮子推送到生产
  3. 此外,它适用于使用C的库。

答案 1 :(得分:0)

你看过buildout(zc.buildout)吗?使用自定义配方,您可以自动完成大部分操作。