Python包装状态:Buildout,Distribute,Distutils,EasyInstall等

时间:2009-12-29 23:06:50

标签: python distutils easy-install buildout distribute

上一次我不得不担心安装Python软件包是在两年前与EnthoughtNumPyMayaVi2一起工作的。那段经历给了我挥之不去的噩梦,这些噩梦与古怪的行为安装有关。在非标准位置更新Python包(例如,在$HOME/usr/local2.6/中)。

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

5 个答案:

答案 0 :(得分:10)

首先,无论您决定使用哪种安装工具,都要开始使用virtualenv --no-site-packages!这样,python软件包不会全局安装,您可以轻松地返回到旧项目和新项目的位置。

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

另外,我建议调查Fabric作为自动执行管理任务的方法。

答案 1 :(得分:9)

Distributesetuptoolseasy_install)的新分支,也应予以考虑。甚至是Guido recommends it

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

答案 2 :(得分:9)

在为我的所有项目安排使用buildout之前,我已经对这个主题做了一些安静的研究(价值几周)。

  除了Buildout之外,

DistUtils和EasyInstall!

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

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

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

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

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

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

在项目的 fabfile.py 中,我包含测试函数,用于测试我通过系统软件包管理器安装的系统软件包的存在。

总之,以下是我使用这些工具的方法:

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

<强> easy_install的    我用来安装我在所有项目中使用的pypi包,但是项目不依赖于这些包。

<强>附加件    我用来管理项目的依赖性。

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

答案 3 :(得分:3)

每当我需要提醒自己游戏的状态时,我会将这些看作是一个起点:

答案 4 :(得分:0)

我无法轻易帮助你找到力量,但我可以让它变得更难,因为它还取决于你想要使用的平台。

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

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

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