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

5

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

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

以下是问题:

  1. pip依赖项束非常大,显著增加了Debian软件包的大小。这不是太大的问题,但很烦人。
  2. 每次部署时都必须构建所有C库(PyMongo、BCrypt等)。这需要一些时间(几分钟),在生产中执行这个CPU密集型工作有点糟糕。

以下是我的约束条件:

  1. 必须在Python 3上工作。最好是3.2
  2. 必须具有依赖项隔离
  3. 必须与使用C的库一起使用(如PyMongo)

我听说过冻结,但我无法使其正常工作。Pypi中的cx_freeze似乎不编译(至少在我的Python上)。其他冻结实用程序似乎无法与Python 3一起使用。有什么更好的方法吗?

2个回答

1

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

在部署机器上创建一个虚拟环境,并将 wheel 以及任何依赖项(也作为 wheel 构建)部署到该虚拟环境中。

这解决了以下问题:

  1. 使用单独的依赖项 wheel 可以避免重新部署未更改的依赖项,从而减小部署包的大小
  2. 构建大型软件包(如 lxml 或 scipy)可以在本地完成,然后将编译后的 wheel 推送到生产环境

此外,它可以很好地处理使用 C 库的情况。


0

你看过buildout(zc.buildout)吗?通过自定义的方法,你可以自动化解决大部分问题。


这是自动化的 - 自动化不是我的问题。我的问题是它很慢,而且需要在生产环境中编译。 - Cal Paterson
你看过“wheel”发行包吗? - sureshvv
Wheel现在已经达到了对于这种问题非常有用的程度。 - Cal Paterson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接