代码之家  ›  专栏  ›  技术社区  ›  Pete

python打包的状态:buildout、distribute、distutils、easyinstall等

  •  24
  • Pete  · 技术社区  · 15 年前

    上次我不得不担心安装python包是在两年前 Enthought , NumPy MayaVi2 . 这段经历让我做了一个关于在非标准位置安装和更新python包的奇怪行为的噩梦(在 $HOME/usr/local2.6/ ,例如)。

    不管怎样,我的工作是带我回去安装各种python包。这个 CheeseShop Tutorial 除了建筑外,还提到了distutils和easyinstall!我很难找到一个地方来比较这些(和其他)pypi安装工具,所以我希望能够进入stackoverflow社区: 每个安装工具的优缺点是什么?

    5 回复  |  直到 14 年前
        1
  •  10
  •   lemonad    15 年前

    首先,不管您决定使用什么安装工具,都要开始使用 virtualenv --no-site-packages !这样,python包就不会在全局范围内安装,您可以很容易地回到以前和新项目中的位置。

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

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

        2
  •  9
  •   Alex Brasetvik    15 年前

    Distribute 是一个新的叉子 setuptools ( easy_install ,这也应该考虑。偶数 Guido recommends it .

    构建与包装是正交的——你可以 use buildout with distribute .

        3
  •  9
  •   Taras Mankovski    15 年前

    在决定将buildout用于我所有的项目之前,我已经对这个话题做了一些安静的研究(几周的时间)。

    除建筑外,还可安装distutils和easyinstall!

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

    例如,easy_install用于将distutils包从pypi(cheeseshop)安装到系统python的site packages目录中。这大大简化了将包安装到系统/全局sys.path的过程。

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

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

    现在,有件事 虚拟现实 . 很明显,virtualenv的一个最广为人知的特点是 --没有网站包 期权。我没有发现这个选项特别有用,因为我使用buildout。buildout管理sys.path,只包含我要求它包含的包。它还包括系统python站点包中的所有内容,但是由于我没有在项目中使用的任何内容,所以我从不发生冲突。

    另外,我发现——没有任何站点包只会妨碍我的开发过程,因为有些包是我使用Sistem的打包系统安装的。通常,凡是有需要编译的C库的东西,我都是通过系统的打包系统来安装的。

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

    总之,以下是我如何使用这些工具:

    系统的包管理器(apt get、yam、port、fink…) 我使用其中一个来安装这个系统所需的python版本。我也用它来安装像 lxml 其中包括c库。

    简易安装 我使用pypi安装所有项目中使用的软件包,但项目并不依赖于这些软件包。

    积木 我用来管理一个项目的依赖性。

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

        4
  •  3
  •   Sam Brightman    14 年前

    每当我需要提醒自己游戏的状态时,我都会以这些为出发点:

        5
  •  0
  •   Arne Babenhauserheide Ry4an Brase    15 年前

    我不容易帮你找到力量,但我可以让它有点难,因为它也取决于你想使用的平台。

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

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

    当我编写代码时,我只是简单地使用distutils(因为它允许非常容易地构建portage ebuild)和一些基本的setuptools特性,或者组织我的程序,这样人们就可以从程序文件夹下载并运行它们(理想情况下,只需在某个时候解包源文件/克隆存储库即可)重新)。这不是一个完美的解决方案,但是在核心python团队决定他们想移动的方向之前,我不想再修复一条可能消失的路径。