关于 pyproject.toml 与 setup.py 的问题

Questions on pyproject.toml vs setup.py

正在阅读 pyproject.toml、python -m pip install、poetry、flit 等 - 我有几个关于将 setup.py 替换为 pyproject.toml 的问题。

我最大的问题是 - toml 文件如何替换 setup.py。意思是,一个 toml 文件不能做一个 py 文件可以做的所有事情。读进去,诗和flit把setup.py完全换成了pyproject.toml。虽然 pip 使用 pyproject.toml 来指定构建工具,但仍然使用 setup.py 来指定其他所有内容。

一个很好的例子是,pip 目前无法直接在 toml 文件中为控制台脚本做入口点,但 poetry 和 flit 可以。

我现在的主要问题是;

pyproject.toml 的重点是提供构建系统要求。它是一个元数据文件。因此,理想的解决方案是仅使用此文件来指定构建系统要求并仍然利用 setup.py 来处理其他所有内容。

我很困惑,因为我觉得我们为了解决一个相当简单的问题而损失了很多。通过完全使用 setup.py 并将其替换为 pyproject.toml,我们失去了很多我们可以在 setup.py 中做的有用的事情。我们不能使用 __version.py__,我们失去了自动创建万向轮和 sdist 以及使用 Twine 将我们的包上传到 PyPi 的能力。我们目前可以在 setup.py 文件中执行此操作。

我只是有时间思考为什么我们要用仅元数据的文件完全替换 setup.py。似乎将它们一起使用是两全其美的方法。我们解决了先有鸡还是先有蛋的构建系统问题,并保留了 setup.py 可以做的很多有用的事情。

我们不需要 setup.py 来以开发模式安装吗?或者这可能只是一个 pip 问题?

这更像是评论而不是答案,但由于我缺少声誉,我不得不将其作为答案。

目前我也在研究这个功能。我发现了这个 experimental feature setuptools 的解释,它应该只引用 pyproject.toml,最后不需要 setup.py

关于 setup.pydynamic 行为,我发现您可以为 [project] 元数据

下的字段设置动态行为
dynamic = ["version"]

[tool.setuptools.dynamic]
version = {attr = "my_package.__version__"}

最后,我猜 setuptools 会覆盖缺失的 setup.py 执行并放置必要的 egg-links 开发模式。

我也非常感谢关于该主题的任何更多意见。

Pip 不使用 setup.py 做其他事情。
Setuptools 本身不鼓励使用 setup.py 并过渡到 setup.cfg(或 pyproject.toml)。
许可证、摘要、名称、author-email、版本...都可以在没有 setup.py 的情况下使用 pip,并且 pip 也创建了一个轮子。

亲眼看看 pip 可以对 pyproject.toml 文件做什么:
https://pip.pypa.io/en/stable/reference/build-system/pyproject-toml/

您可以使用 entry-points 键指定入口点,如 @casabre 在 link 处所示: https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html

Toml 不仅仅是一个简单的 requirements.txt。您可以设置复杂的指令,例如:

tool.setuptools.packages = {find = {where = ["src"], exclude=["tests*"]}}

并且 __version__.py 成为您的 pyproject.toml 文件中的一个简单条目,甚至像@casabre 所说的那样是动态的:

[project]
version = "0.1.0"

使用 twine 上传到 PyPi 也应该按照这个 link 工作: https://setuptools.pypa.io/en/latest/userguide/quickstart.html#uploading-your-package-to-pypi

要在开发模式下安装,您可以在 pyproject.toml:

中配置类似这样的内容
[project.optional-dependencies]
dev = ["flake8", "pytest"]

然后 pip install .[dev] 在您的项目文件夹中。