【问题标题】:State of Python Packaging: Buildout, Distribute, Distutils, EasyInstall, etcPython 打包状态:Buildout、Distribute、Distutils、EasyInstall 等
【发布时间】:2010-12-30 22:53:01
【问题描述】:

上一次我不得不担心安装 Python 包是在两年前使用EnthoughtNumPyMayaVi2。那次经历让我一直在做与在非标准位置(例如$HOME/usr/local2.6/)安装和更新 Python 包的古怪行为相关的噩梦。

无论如何,我的工作让我重新开始安装各种 Python 包。 CheeseShop Tutorial 除了 Buildout 之外还提到了 DistUtils 和 EasyInstall!我很难找到一个比较这些(和其他)PyPi 安装工具的地方,所以我希望能加入 StackOverflow 社区:每种安装工具的优缺点是什么?

【问题讨论】:

  • 部署层似乎比今天的典型包更复杂。 Eggs,简单的这个和虚拟的那个......对不起,但我更乐意将 .py 文件复制到 sys.path 上的某个位置。至少这样我可以看到正在发生的事情,并且不会出现莫名其妙的部署和导入错误。
  • 还没有人提到distutils2 vs. distutilsbento ...
  • 我写的这个答案将回复部分问题:stackoverflow.com/a/6522905/821378
  • 截至 2013 年 6 月,我找到了 the most comprehensive answer

标签: python distutils easy-install buildout distribute


【解决方案1】:

首先,不管你选择什么安装工具,开始使用virtualenv --no-site-packages!这样,python 包就不会全局安装,您可以轻松地回到旧项目和新项目中的位置。

现在,您的比较有点像苹果对梨,因为您列出的工具并不相互排斥。但是,我可以完全推荐 Buildout。它将安装 python 包以及其他东西,并让您自动安装和部署(复杂)项目。

另外,我建议将 Fabric 作为自动化管理任务的一种手段。

【讨论】:

    【解决方案2】:

    Distributesetuptools (easy_install) 的新分支,也应该考虑。甚至Guido recommends it

    Buildout 与包装正交 --- 你可以use buildout with distribute

    【讨论】:

    • Distribute 已被折旧并合并回 Setuptools。
    【解决方案3】:

    在决定将 buildout 用于我的所有项目之前,我已经对这个主题进行了一些研究(价值几周)。

    除了 Buildout 之外的 DistUtils 和 EasyInstall!

    创建一个地方来比较所有这些工具的困难在于,它们都是同一工具链的一部分,并且被一起使用以创建可预测、可靠和灵活的工具集。

    例如,easy_install 用于将 distutils 包从 pypi(cheeseshop) 安装到系统 Python 的 site-packages 目录。这极大地简化了将软件包安装到您的系统/全局 sys.path。

    easy_install 对于所有项目都一致的包非常方便。但是,我发现我更喜欢使用系统的 easy_install 来安装项目不依赖的包。例如,github-cli 我用于每个项目,因为它允许我从命令行与项目的 Github 问题进行交互。我在项目中使用它,但这是为了方便,项目本身不依赖于这个包。

    为了管理项目的依赖关系,我使用 buildout。 Buildout 允许您明确指出您的项目所依赖的包的版本。我更喜欢 buildout 而不是 pip-requirements.txt 因为 buildout 是声明性的。使用 pip,您可以安装软件包,并在开发结束时生成 requirements.txt 文件。另一方面,使用 Buildout,您可以在将包 egg 添加到项目之前修改 buildout.cfg。这迫使我意识到我要添加到项目中的包。

    现在,有一个 virtualenv 的问题。 virtualenv 最广为人知的特性之一显然是 --no-site-packages 选项。我还没有发现该选项特别有用,因为我使用的是 buildout。 Buildout 管理 sys.path 并且只包含我要求它包含的包。它还包括系统 Python 的站点包中的所有内容,但由于我没有在项目中使用的任何内容,所以我从来没有冲突。

    另外,我发现 --no-site-packages 只会阻碍我的开发过程,因为我使用系统的打包系统安装了一些包。通常,任何有 C 库需要编译的东西,我都是通过系统的打包系统安装的。

    在项目的 fabfile.py 中,我包含了测试函数来测试我通过系统的包管理器安装的系统包是否存在。

    总之,我是这样使用这些工具的:

    系统的包管理器(apt-get, yam, port, fink ...) 我使用其中之一在这个系统上安装我需要的 python 版本。我还用它来安装像 lxml 这样的包,其中包括 c 库。

    easy_install 我使用 pypi 安装包,用于所有项目,但项目不依赖于这些包。

    扩建 我用来管理项目的依赖关系。

    根据我的经验,这个工作流程非常灵活、便携且易于使用。

    【讨论】:

      【解决方案4】:

      每当我需要提醒自己比赛状态时,我都会以这些为起点:

      【讨论】:

      • 除非我遗漏了第一个和第三个链接的内容。
      【解决方案5】:

      我不能轻易地帮助你找到力量,但我可以让它更难一些,因为它还取决于你想使用的平台。

      例如,如果您需要在基于 Gentoo (GNU/Liunx) 的计算机上安装 python 包,您可以轻松地使用g-pypi 为所有使用 distutils 的包创建 ebuilds(而不是:一个 setup.py)。这样它们就可以完全集成到您的系统中,并且可以像所有其他工具一样添加、更新和删除。但它自然只适用于基于 Gentoo 的系统。

      您也可以使用yolk 来了解通过easy_install 在您的系统上安装的所有软件包(不仅在Gentoo 上)。

      当我编写代码时,我只是使用 distutils(因为它可以非常轻松地构建 portage ebuilds)和一些基本的 setuptools 功能,或者组织我的程序以便人们可以从程序文件夹中下载并运行它们(最好解压源代码在某处存档/克隆存储库)。这不是完美的解决方案,但在核心 python 团队决定他们想要移动的方式之前,我不想修复(不再)可能消失的路径。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-06
        • 2010-12-16
        • 2011-03-10
        • 1970-01-01
        • 1970-01-01
        • 2010-12-16
        • 2022-01-21
        • 2011-01-10
        相关资源
        最近更新 更多