Python 包管理现状:Buildout、Distribute、Distutils、EasyInstall 等

24 投票
5 回答
3212 浏览
提问于 2025-04-15 17:28

上一次我需要担心安装Python包是在两年前,那时我在使用EnthoughtNumPyMayaVi2。那次经历让我对在一些不常见的位置安装和更新Python包产生了挥之不去的噩梦(比如在$HOME/usr/local2.6/这样的地方)。

不过,现在我的工作又让我回到了安装各种Python包的事情上。CheeseShop教程提到了DistUtils和EasyInstall,还有Buildout!我很难找到一个地方来比较这些(以及其他)PyPi安装工具,所以我希望能借助StackOverflow社区的力量:每种安装工具的优缺点是什么?

5 个回答

9

我在这个话题上做了不少研究(花了几周的时间),最后决定在我的所有项目中使用buildout。

除了Buildout,还有DistUtils和EasyInstall!

要把这些工具放在一个地方进行比较其实挺难的,因为它们都是同一工具链的一部分,通常是一起使用的,目的是创建一个可预测、可靠和灵活的工具集。

举个例子,easy_install用来从pypi(也叫cheeseshop)安装distutils包到你系统的Python的site-packages目录。这大大简化了将包安装到你的系统/global sys.path中的过程。

easy_install对于那些在所有项目中都一致的包来说非常方便。不过,我发现我更喜欢用系统自带的easy_install来安装那些项目不依赖的包。比如,我在每个项目中都用的github-cli,因为它让我可以通过命令行与项目的Github Issues互动。我在项目中使用这个工具,但它只是为了方便,项目本身并不依赖这个包。

至于管理项目的依赖关系,我使用buildout。Buildout可以让我明确指定项目依赖的包的版本。我更喜欢buildout而不是pip的requirements.txt,因为buildout是声明式的。用pip时,你先安装包,最后生成requirements.txt文件。而使用Buildout时,你在将包添加到项目之前就修改buildout.cfg。这让我更清楚自己在项目中添加了哪些包。

现在说到virtualenv。virtualenv最被宣传的功能显然是--no-site-packages选项。不过,我发现这个选项对我来说并没有特别大的用处,因为我使用的是buildout。Buildout管理sys.path,只包含我指定要包含的包。它也会包含系统Python的site-packages中的所有内容,但因为我在那里面没有用到的东西,所以我从来没有遇到过冲突。

而且,我觉得--no-site-packages只会妨碍我的开发过程,因为有些包是通过系统的包管理系统安装的。通常,任何需要编译的C库,我都是通过系统的包管理系统来安装。

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

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

系统的包管理器(apt-get, yam, port, fink ...) 我用这些来安装我需要的Python版本,也用它来安装像lxml这样的包,因为它们包含C库。

easy_install 我用它来安装我在所有项目中使用的pypi包,但这些项目并不依赖这些包。

buildout 我用它来管理项目的依赖关系。

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

9

Distribute 是一个新的项目,它是 setuptools(也就是 easy_install)的一个分支,值得关注。甚至连 Guido 也推荐它

Buildout 和打包是两个不同的概念——你可以 把 buildout 和 distribute 一起使用

10

首先,不管你选择哪个安装工具,记得使用 virtualenv --no-site-packages!这样的话,Python的包就不会被全局安装,你也能轻松回到以前的项目或者新项目的状态。

现在,你的比较有点像把苹果和梨子放在一起,因为你列出的工具并不是互相排斥的。不过,我可以完全推荐Buildout。它不仅可以安装Python包,还能安装其他东西,并且可以让你自动化安装和部署(复杂的)项目。

另外,我也建议你看看 Fabric,它可以帮助你自动化一些管理任务。

撰写回答