使用pyproject.toml还需要requirements.txt吗?

问题描述 投票:0回答:5

自 2022 年中期以来,现在可以摆脱

setup.py
setup.cfg
,转而使用
pyproject.toml
。可编辑安装适用于最新版本的 setuptools 和 pip,甚至官方打包教程也从
setup.py
切换到
pyproject.toml

但是,有关

requirements.txt
的文档似乎也已被删除,我想知道现在将固定需求放在哪里?

回顾一下:过去的常见做法是将依赖项(没有版本固定)放在

setup.py
中,以避免当此软件包与需要相同依赖项但版本要求冲突的其他软件包一起安装时出现问题。对于打包库,
setup.py
通常就足够了。

对于部署(即非库),您通常还提供具有版本固定依赖项的

requirements.txt
。因此,您不会意外地获得该包经过测试的最新和最好的依赖项的确切版本。

所以我的问题是,有什么改变吗?当与

requirements.txt
一起使用时,您是否仍然将固定的需求放在
pyproject.toml
中?或者有多余的部分吗 为了那个
pyproject.toml
?某处有相关文档吗?

python python-packaging requirements.txt pyproject.toml
5个回答
10
投票

引用自这里

我当前的假设是:[...]您将(大部分未固定的)依赖项放入 pyproject.toml 而不是 setup.py,因此您的库可以作为其他内容的依赖项安装,而不会因为解决版本问题而造成太多麻烦限制。

最重要的是,对于“可部署的应用程序”(由于缺乏更好的术语),您仍然希望维护一个具有精确版本固定的单独的requirements.txt。

这已得到 Python 包装权威 (PyPA) 成员的确认,并且 PyPA 建议的说明应在某个时候进行相应更新。


7
投票

这是 pyproject.toml

pip 文档

...此文件包含构建系统要求和信息,pip 使用这些来构建包。

所以这不是正确的地方。查看侧边栏,我们可以看到有一个

Requirements File Format
的条目,这是“旧”
requirements.txt
文件


3
投票

所以我的问题是,有什么改变吗?与 pyproject.toml 一起使用时,您是否仍然将固定需求放在requirements.txt中?或者 pyproject.toml 中有一个额外的部分吗?某处有相关文档吗?

什么都没有改变。固定依赖项不属于项目的打包元数据,这意味着固定依赖项不属于

dependencies
文件的
[project]
部分的
pyproject.toml
列表。截至今天,我知道 pyproject.toml 中没有 标准化
 部分用于固定依赖项。这个文档尽管已经过时了,但其精神仍然适用:“抽象依赖项”属于包元数据(例如在
[project]
pyproject.toml
部分)和“具体依赖项”可以在一个
requirements.txt
文件(如果需要)(或者在任何其他具有类似用途的文件中,例如 Poetry
poetry.lock
Pipenv
Pipfile.lock
,仅举其中两个,具体取决于项目的开发工作流程)和工具)。


1
投票

背景

我发现这个问题“使用 pyproject.toml 时是否仍然需要requirements.txt”,并且与上述问题描述的用例相比,有一个“不同的用例”。我决定添加这个答案作为“长评论”,而不是打开一个具有相同标题的额外问题,以支持类似情况下的用户。 在我的用例中我不将代码安装为库/包

,而是将其用作

应用程序 可以通过使用 hatchling

作为

build-backend

 并在 
dependencies
[project.optional-dependencies]
 部分中定义依赖项来从 pyproject.toml 安装依赖项。
安装依赖项

pip install .[dev]

pyproject.toml
中相应部分的示例:

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = 'my_dummy_project_name'
version = '0.0.1'
requires-python = ">=3.11.0"

dependencies = [
    'cryptography==41.0.1',
]

[project.optional-dependencies]
lining = [
  'pylint==2.17.4'
]
formatting = [
  'black[d]==23.3.0'
]
dev = ['my_dummy_project_name[linting, formatting]']

相关

https://github.com/pypa/packaging.python.org/issues/685

https://peps.python.org/pep-0631/

https://stackoverflow.com/a/75503961/2876079

https://pip.pypa.io/en/stable/cli/pip_install/#options

https://github.com/winpython/winpython/issues/1128

如何编写一个可以安装包的最小工作 pyproject.toml 文件?

我建议切换到

-2
投票
poetry

,它比依赖管理的标准

pip
好得多。而且因为它使用 pyproject.toml
,您的依赖项和配置都位于一个位置,因此更容易管理所有内容 🙂

© www.soinside.com 2019 - 2024. All rights reserved.