如何编写可以安装包的最小工作 pyproject.toml 文件?
Posted
技术标签:
【中文标题】如何编写可以安装包的最小工作 pyproject.toml 文件?【英文标题】:How to write a minimally working pyproject.toml file that can install packages? 【发布时间】:2021-01-16 21:37:55 【问题描述】:Pip 支持 pyproject.toml
文件,但到目前为止,新模式的所有实际使用都需要一个自动生成这些文件的第三方工具(例如,诗歌和 pip)。不像setup.py
已经是人类可写的,pyproject.toml
不是(还)。
来自setuptools docs,
[build-system]
requires = [
"setuptools >= 40.9.0",
"wheel",
]
build-backend = "setuptools.build_meta"
但是,此文件不包括包依赖项(如 PEP 621 中所述)。 Pip 确实支持使用 pyproject.toml
安装软件包,但 pep 没有指定如何在 pyproject.toml
中为官方构建系统 setuptools
编写软件包依赖项。
如何在pyproject.toml
中写包依赖?
相关 *** 问题:
How to init the pyproject.toml file
这个问题要求一种自动生成pyproject.toml
的方法,我的问题不同,因为我要求的是人工编写的pyproject.toml
。
【问题讨论】:
【参考方案1】:PEP 621
有一个名为PEP 621 的标准指定项目的元数据(包括依赖项)应如何在pyproject.toml
文件中布局。
随着时间的推移,越来越多的构建后端添加了对 PEP 621 的支持,例如:
pdm
flit
trampolim
enscons
whey
可能更多...
我的问题有所不同,因为我要求的是人工编写的
pyproject.toml
pyproject.toml
文件是“人类可写”(以及setup.cfg
)。我会在这里给setuptools和poetry一个答案。
但首先,重要的是要知道,在这种情况下,setuptools 和 poetry 的行为类似于所谓的构建后端,并且今天有多个这样的后端可用,setuptools 和 poetry 只是其中的两个例子。其他构建后端包括flit、pymsbuild、pdm 等。他们中的一些人希望他们的配置(包括依赖项)写在pyproject.toml
中,一些人希望它在另一个文件中。
设置工具
截至今天(2021 年 10 月),setuptools 不支持将其配置写入 pyproject.toml
。您仍然必须编写 setup.py
或 setup.cfg
或两者的组合。
我的建议是尽量写setup.cfg
,setup.py
可以短到:
import setuptools
setuptools.setup()
这样的setup.cfg
可能如下所示:
[metadata]
name = Thing
version = 1.2.3
[options]
install_requires =
SomeLibrary ~= 2.2
packages = find:
关于依赖关系的具体参考:
https://setuptools.readthedocs.io/en/latest/userguide/dependency_management.html https://www.python.org/dev/peps/pep-0508/ https://www.python.org/dev/peps/pep-0440/顺便说一句,请注意在某些情况下可以完全省略setup.py
文件,其中一个条件是存在setup.cfg
文件和pyproject.toml
文件并包含所有必要的信息。这是一个pyproject.toml
的示例,它适用于setuptools 构建后端:
[build-system]
build-backend = 'setuptools.build_meta'
requires = [
'setuptools >= 43.0.0',
]
最后,来自 setuptools 维护者的plans 允许在pyproject.toml
中编写配置(而不是setup.cfg
或setup.py
),但我们还没有( 2021 年 10 月)。
诗歌
在 poetry 中,所有内容都在 pyproject.toml
中定义(但它使用 poetry-specific 部分,即:它不使用 PEP 621 标准)。
此文件可以手写。据我所知,没有必要明确安装诗歌本身(pip install
和 pip wheel
等命令可以让你走得更远)。
pyproject.toml
文件可以很简单:
[tool.poetry]
name = 'Thing'
version = '1.2.3'
[tool.poetry.dependencies]
python = '^3.6'
SomeLibrary = '~2.2'
[build-system]
requires = ['poetry-core~=1.0']
build-backend = 'poetry.core.masonry.api'
参考文献:
https://python-poetry.org/docs/pyproject/ https://python-poetry.org/docs/dependency-specification/【讨论】:
@Keto 这能回答你的问题吗?有什么可能需要澄清才能接受这个答案? 好的,谢谢。虽然这不是我喜欢听到的答案,但这是正确且可以接受的答案。答案值得更新,因为 setuptools 和其他工具采用 PEP 621(特别是 package dependency)。 一些工具开始支持它。但它非常年轻。我已经在回答中提到了pdm
。后来其他一些构建后端也添加了对 PEP621 的支持,但我不记得具体是哪些,可能看一下flit
、trampolim
、enscons
等。
@Keto "虽然这不是我喜欢听到的答案",你的意思是什么?你的期望是什么?
有一个包叫ppsetuptools。以上是关于如何编写可以安装包的最小工作 pyproject.toml 文件?的主要内容,如果未能解决你的问题,请参考以下文章
错误:无法为 gevent 构建***,这是安装基于 pyproject.toml 的项目所必需的
MacOS Python安装which is required to install pyproject.toml-based projects解决办法
MacOS Python安装which is required to install pyproject.toml-based projects解决办法
MacOS Python安装which is required to install pyproject.toml-based projects解决办法