【问题标题】:How to distribute and deploy Python 3 code with dependency isolation如何使用依赖隔离分发和部署 Python 3 代码
【发布时间】:2012-11-15 15:02:17
【问题描述】:

我对当前部署 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。我怎样才能更好地做到这一点?

【问题讨论】:

    标签: python deployment python-3.2


    【解决方案1】:

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

    在部署机器上创建一个虚拟环境,并将一个轮子连同任何依赖项(也构建为轮子)部署到该虚拟环境。

    这样就解决了问题:

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

    此外,它适用于使用 C 的库。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这是自动化的——自动化不是我的问题。我的问题是它很慢并且需要在生产环境中编译
      • 你看过“wheel”分发包吗?
      • Wheel 现在对这类问题很有用
      猜你喜欢
      • 2013-10-31
      • 2018-04-28
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多