pyproject.toml 文件有什么用?

np8*_*np8 55 python packaging pip pyproject.toml

背景

我正要尝试从 GitHub 下载的 Python 包,发现它没有 . setup.py,所以我无法安装它

pip install -e <folder>
Run Code Online (Sandbox Code Playgroud)

相反,该包有一个pyproject.toml文件,该文件似乎与setup.py通常的条目非常相似。

我发现了什么

谷歌搜索引导我进入PEP-518,它setup.py在基本原理部分给出了一些批评。但是,它没有明确说明setup.py应该避免使用 ,或者pyproject.toml完全取代setup.py.

问题

pyproject.toml用来代替的东西setup.py吗?或者一个包应该同时带有 apyproject.toml和 a setup.py
如何安装pyproject.toml处于可编辑状态的项目?

pce*_*pce 29

是的,pyproject.tomlPEP 518的指定文件格式,其中包含 Python 项目的构建系统要求。

这解决了构建工具的依赖性鸡和蛋的问题,即pip可以读取pyproject.toml和什么版本setuptools或者wheel一个可能需要。

如果您需要一个setup.py可编辑的安装,您可以在setup.py以下位置使用垫片:

#!/usr/bin/env python

import setuptools

if __name__ == "__main__":
    setuptools.setup()
Run Code Online (Sandbox Code Playgroud)

  • 我很困惑... pip 与构建有什么关系?pip不就是为了安装依赖吗? (4认同)
  • 谢谢你的垫片!所以看来“pyproject.toml”“几乎”是“setup.py”的替代品,并且开发人员应该使用“两者”,以便可以在可编辑状态下安装项目?奇怪的是,我已经在各种小项目中使用 setup.py 几年了,从来不需要消除“先有鸡还是先有蛋的问题”。 (3认同)
  • 一个常见的先有鸡还是先有蛋的问题是使用 pybind11 构建扩展。`setup.py` 需要将 `pybind11.get_include()` 添加到编译器标志中,但除非安装了 `pybind11`,否则无法执行此操作。如果这在 `setup.py` 中被指定为依赖项...... (3认同)
  • @Shannon要构建项目,您可能需要至少安装一些抽象依赖项来执行构建系统。pip 可以充当安装程序后端,而 `pip wheel target-dir` pip 充当构建前端,并使用 `pip install lxml==2.4.0` 作为集成前端,请参阅 [PEP517](https://www .python.org/dev/peps/pep-0517/) (2认同)

Cee*_*man 26

pyproject.toml是新的统一 Python 项目设置文件,用于替换setup.py. 可编辑安装仍然需要setup.pyimport setuptools; setuptools.setup()

要使用pyproject.toml,运行python -m pip install .

然后,如果项目使用的是poetry而不是pip,您可以%USERPROFILE%\AppData\Local\pypoetry\Cache\virtualenvs像这样安装依赖项(到):

poetry install
Run Code Online (Sandbox Code Playgroud)

然后运行像pytest这样的依赖

poetry run pytest tests/
Run Code Online (Sandbox Code Playgroud)

预提交(使用.pre-commit-config.yaml):

poetry run pre-commit install
poetry run pre-commit run --all-files
Run Code Online (Sandbox Code Playgroud)

  • 在什么意义上“setup.py”不可编辑? (4认同)
  • 显然,可编辑安装不再需要 setup.py。https://setuptools.pypa.io/en/latest/userguide/development_mode.html (4认同)
  • @Dave *可编辑安装*是一种安装,其中安装的文件是指向源目录的符号链接。这对于开发人员特别有用,因此他们不需要每次更改一行代码时都重新安装包。 (2认同)

Gre*_*cki 20

仅回答这部分,其余部分已由其他人很好地解释了:

pyproject.toml如何安装处于可编辑状态的项目?

解决方案

自 2022 年 2 月发布诗歌核心 v1.0.8 以来,您可以执行以下操作:

a) 您需要在您的pyproject.toml

[build-system]
requires = ["poetry-core>=1.0.8"]
build-backend = "poetry.core.masonry.api"
Run Code Online (Sandbox Code Playgroud)

b)运行:

pip install -e .
Run Code Online (Sandbox Code Playgroud)

来源

  • 2022 年更新:PEP 660 在“pip”(从 21.3.0 开始)和一些后端(例如“flit”)中实现。但是“setuptools”方面没有任何进展。 (4认同)

Evg*_*423 13

目前有多种打包工具在 Python 社区中很流行,虽然setuptools似乎仍然很流行,但它不再是事实上的标准。这种情况给最终用户和开发人员带来了许多麻烦:

  1. 对于setuptools从源代码基于包的安装/分配的构建可能会失败,如果一个人没有setuptools安装;
  2. 基于其他打包工具的包不能使用pip. 必须先安装打包工具,然后使用特定于工具的命令来安装/构建分发包;
  3. 如果包作者决定更改打包工具,则工作流也必须更改以使用不同的工具特定命令。

pyproject.tomlPEP 517PEP 518引入的新配置文件,用于解决这些问题:

...想想为项目生成构建工件所需的(粗略)步骤:

  1. 项目的源代码检出。
  2. 安装构建系统。
  3. 执行构建系统。

此 PEP [518] 涵盖步骤 #2。PEP 517涵盖了第 3 步......

任何工具也可以使用自己的部分(表)扩展此文件以接受特定于工具的选项,但这取决于他们而不是必需的。


For setuptools-based 包pyproject.toml并不是严格意义上的替换setup.py,而是在仍然需要时确保其正确执行。对于其他打包工具——是的,它是:

如果build-backend键存在,则优先,源树遵循指定后端的格式和约定(因此不需要setup.py除非后端需要)。项目可能仍希望包含setup.py与不使用此规范的工具的兼容性。


“可编辑安装”是一个setuptools特定的功能,因此PEP 517不支持它:

Install Options:
  -e, --editable <path/url>   Install a project in editable mode (i.e. setuptools "develop mode")
Run Code Online (Sandbox Code Playgroud)

setuptools以可编辑模式安装-based 包,它需要有一个setup.py至少包含最少内容的文件:

from setuptools import setup

setup()
Run Code Online (Sandbox Code Playgroud)

  • @Pynchia 这些术语[由 PEP 517 定义](https://peps.python.org/pep-0517/#terminology-and-goals)。简而言之,_frontend_ 是一个可以启动构建或安装过程的工具,而_backend_ 是一个执行实际构建的打包库。`pip` 是 Python 的默认前端,`setuptools` 是默认后端。大多数其他打包工具将自身分为前端和后端。每个后端和前端可能都有自己的功能,但是“pyproject.toml”支持使它们彼此兼容。 (4认同)
  • 请解释一下什么是“后端”。`pip` 是后端还是前端?它有什么关系?这些后端从哪里来?哪个前端使用哪个后端? (2认同)