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

unc*_*yon 19 python setup.py pyproject.toml

阅读 pyproject.toml、python -m pip install、诗歌、flit 等 - 我有几个关于用 pyproject.toml 替换 setup.py 的问题。

我最大的问题是 - toml 文件如何替换 setup.py。这意味着,toml 文件无法完成 py 文件可以做的所有事情。仔细阅读,poetry 和 flit 完全用 pyproject.toml 替换了 setup.py。虽然 pip 使用 pyproject.toml 来指定构建工具,但仍然使用 setup.py 来执行其他操作。

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

我现在的主要问题是;

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

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

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

无论如何,我们不需要 setup.py 来在开发模式下安装吗?或者也许这只是一个点问题?

cas*_*bre 13

目前我也在研究这个功能。我找到了 setuptools 的这个实验性功能解释,它应该只是引用,pyproject.toml而不需要setup.py最后。

关于dynamic的行为setup.py,我发现您可以为[project]元数据下的字段设置动态行为

dynamic = ["version"]

[tool.setuptools.dynamic]
version = {attr = "my_package.__version__"}
Run Code Online (Sandbox Code Playgroud)

其中设置了本例中的相应版本,例如my_package.__init__.py

__version__ = "0.1.0"

__all__ = ["__version__"]
Run Code Online (Sandbox Code Playgroud)

最后,我猜想 setuptools 将覆盖缺失的setup.py执行并为开发模式放置必要的 Egg 链接。


Spa*_*tan 6

Pip 不会将 setup.py 用于其他所有事情。
setuptools 本身不鼓励使用 setup.py 并转换为 setup.cfg (或 pyproject.toml)。
许可证、摘要、名称、作者电子邮件、版本...所有这些都可以在没有 setup.py 的情况下使用 pip,并且轮子也是由 pip 创建的。

亲自了解 pip 可以对文件执行哪些操作pyproject.toml
https://pip.pypa.io/en/stable/reference/build-system/pyproject-toml/

您可以使用密钥指定入口点entry-points,如 @casabre 的链接所示: 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"
Run Code Online (Sandbox Code Playgroud)

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

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

[project.optional-dependencies]
dev = ["flake8", "pytest"]
Run Code Online (Sandbox Code Playgroud)

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