自 2022 年中以来,现在可以摆脱
setup.py
、
setup.cfg
,转而使用
pyproject.toml
可编辑安装适用于最新版本的 setuptools 和 pip,甚至官方
打包教程
从
setup.py
切换到
pyproject.toml
但是,有关
requirements.txt
的文档似乎也已被删除,我想知道现在将
固定的要求
放在哪里?
作为复习:过去的常见做法是将依赖项(没有版本固定)放在
setup.py
中,以避免在该包获取时出现问题与需要相同依赖项但版本要求冲突的其他软件包一起安装。对于打包库,a
setup.py
通常就足够了。
对于部署(即非库),您通常还提供 a
requirements.txt
以及版本固定的依赖项。因此,您不会意外地获得该包经过测试的最新和最好的依赖项的确切版本。
所以我的问题是,有什么变化吗?当与
requirements.txt
一起使用时,您是否仍然将固定需求放在
pyproject.toml
中?或者有多余的部分吗
对于
pyproject.toml
?某处有相关文档吗?
是对的,
pyproject.toml
现在是打包 Python 项目的推荐方式,并且在很多情况下可以取代
setup.py
和
setup.cfg
。但是,
requirements.txt
的作用略有不同,而且在使用
pyproject.toml
时,它并非完全过时。下面是具体说明:
pyproject.toml
-
用于打包和依赖管理。
它使用
[project]
表存储元数据(如包名称、版本、作者)和[build-system]
表来指定 setuptools 或 poetry 之类的构建工具。 -
依赖项位于
[project.dependencies]
和[project.optional-dependencies]
中。 可以在此处指定项目的运行时依赖项,包括版本限制。
requirements.txt
-
用于固定依赖项的特定用例。
虽然不建议将其作为主要的依赖项管理方法,但它在以下情况下仍然有用:
-
部署脚本和自动化:
当需要一个简单的方法来固定特定环境(如生产服务器)的依赖项版本时,
requirements.txt
可以提供比pyproject.toml
更直接的途径。 -
与不支持
pyproject.toml
的工具的向后兼容性。
-
部署脚本和自动化:
当需要一个简单的方法来固定特定环境(如生产服务器)的依赖项版本时,
那么,应该如何选择呢?
-
对于新的 Python 项目,最好完全采用
pyproject.toml
并利用其依赖管理功能。 在[project.dependencies]
中指定依赖项,并使用版本说明符来固定版本。 -
如果需要
requirements.txt
提供的简单性,可以从pyproject.toml
生成它。 可以使用pip freeze > requirements.txt
创建一个固定版本的依赖项文件,或者使用pip-compile
等工具从更易于管理的规范生成一个固定文件。
文档:
- Packaging Python Projects: https://packaging.python.org/
- PEP 621 (Storing project metadata in pyproject.toml): https://peps.python.org/pep-0621/
总之,虽然
pyproject.toml
为依赖管理提供了更强大的方法,而
requirements.txt
在特定情况下仍然有它的用途。最佳选择取决于的具体需求和工作流程。