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

Pet*_*ete 24 python distutils buildout easy-install distribute

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

无论如何,我的工作让我回到安装各种Python包.该Cheeseshop上教程中提到的distutils和EasyInstall除了扩建!我很难找到一个比较这些(和其他)PyPi安装工具的地方,所以我希望进入StackOverflow社区: 每个安装工具的优点和缺点是什么?

lem*_*nad 10

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

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

此外,我建议将Fabric作为自动执行管理任务的一种方法.


Ale*_*vik 9

Distribute是一个新的fork setuptools(easy_install),也应该考虑.甚至Guido也推荐它.

Buildout与包装正交 - 您可以使用buildout with distribute.


Tar*_*ski 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版本.我也用它来安装像lxml这样包含c库的包.

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

buildout 我用来管理项目的依赖性.

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