关于Setuptools和备选方案的问题

2024-04-29 22:40:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近看到很多setuptools在抨击互联网。最近,我读了James Bennett的On packaging文章,内容是为什么没有人应该使用setuptools。从我在Freenode上的python的时候起,我知道那里有几个灵魂绝对讨厌它。我会把自己算在其中,但我确实用过。

我已经为足够多的项目使用了setuptools来意识到它的不足,我希望有更好的东西。我不太喜欢egg格式和它的部署方式。有了setuptools的所有问题,我还没有找到更好的选择。

我对pip等工具的理解是,它是一个简单的安装替换工具(而不是setuptools)。实际上,pip使用了一些setuptools组件,对吧?

我的大多数软件包都使用setuptools-aware setup.py,它声明了所有依赖项。当它们准备好后,我将构建一个sdist、bdist和bdist_egg,并将它们上传到pypi。

如果我想切换到使用pip,我需要做什么样的更改来摆脱简单的安装依赖关系?依赖项声明在哪里?我想我需要摆脱使用egg格式,只提供源代码分发。如果是,如何生成egg信息目录?或者我需要吗?

这将如何改变我对virtualenv的使用?virtualenv不使用easy_install来管理环境吗?

这将如何改变我使用setuptools提供的“开发”命令?我不应该用那个吗?有什么选择?

我基本上是想了解一下我的开发工作流程会是什么样子。

在有人提出建议之前,我并不是在寻找一个依赖于操作系统的解决方案。我主要关注deb I an linux,但是deb包不是一个选项,原因是Ian Bicking概述了here


Tags: pip工具声明virtualenveggon格式文章
3条回答

首先,pip真的很新。新的,不完整的,基本上未在现实世界中测试过的。

它显示出了巨大的希望,但是在它能够做所有简单安装/设置工具所能做的事情之前,它不太可能在很大程度上流行起来,当然在公司里是不可能的。

简单的安装/设置工具很大而且复杂-这会冒犯很多人。不幸的是,这种复杂性有一个很好的原因,那就是它迎合了大量不同的用例。我自己的系统支持一个大型(>;300)桌面用户池,外加一个具有频繁更新的应用程序的类似大小的网格。我们可以通过允许每个用户从源代码安装来做到这一点的想法是荒谬的-eggs已经证明了自己是分发我的项目的可靠方法。

我的建议是:学会使用setuptools——这真是一件美妙的事情。大多数讨厌它的人不理解它,或者根本没有作为全功能分发系统的用例。

:-)

我将在2014年4月写这篇文章。注意任何关于Python打包、分发或安装的文章的日期。在过去的三年里,比如说,似乎已经减少了一些争论,改进了实现,PEP标准化,统一了战线。

例如,Python Packaging Authority是“一个以Python打包方式维护许多相关项目的工作组”

python.orgPython Packaging User GuideTool RecommendationsThe Future of Python Packaging部分。

distribute是2013年6月重新合并的setuptools分支。指南说,“使用setuptools来定义项目和创建源代码发行版。”

从PEP 453和Python 3.4开始,《指南》建议“使用pip从PyPI安装Python包”,并且pip包含在python3.4中,并由pyvenv安装在virtualenvs中,后者也包含在其中。你可能会发现PEP 453 "rationale" section很有趣。

指南中还提到了一些新的工具,包括^{}^{}

我很高兴我读了以下两本技术/半政治史。

马蒂金·法森,2009年:A History of Python Packaging

由Armin Ronacher于2013年6月撰写(标题并不严肃):Python Packaging: Hate, hate, hate everywhere

pip使用Setuptools,不需要对包进行任何更改。它实际上使用Setuptools安装软件包,使用:

python -c 'import setuptools; __file__="setup.py"; execfile(__file__)' \
    install \
    --single-version-externally-managed

因为它使用了这个选项(--single-version-externally-managed),所以它不会将eggs作为zip文件安装,也不支持同时安装多个版本的软件,而且软件包是平面安装的(如果您只使用distutils,python setup.py install也可以)。Egg元数据仍在安装中。pip也像easy_install一样,下载并安装包的所有需求。

此外,您还可以使用需求文件添加应批量安装的其他包,并使版本需求更加精确(而不必将这些精确的需求放入setup.py文件)。但是如果你不做需求文件,你会像简单安装一样使用它。

对于您的install_requires我不建议进行任何更改,除非您一直试图在那里创建非常精确的已知良好的需求。我认为,在有关版本的setup.py文件中,您的有效性是有限的,因为您无法真正了解新库的未来兼容性,我不建议您尝试预测这一点。需求文件是放置保守版本需求的替代位置。

您仍然可以使用python setup.py develop,事实上,如果您使用pip install -e svn+http://mysite/svn/Project/trunk#egg=Project,它将检查(进入src/project)并对其运行setup.py develop。所以工作流程没有什么不同。

如果您一字不差地运行pip(比如pip install -vv),您将看到许多正在运行的命令,并且您可能会识别其中的大多数命令。

相关问题 更多 >