首先,我相信解析requirements.txt
在包元数据中填充依赖项列表并不是一个好主意。这requirements.txt
文件和“安装依赖项”列表是两个不同的概念,它们不能互换。应该是相反的,包元数据中的依赖项列表应该被视为某种事实来源,并且诸如requirements.txt
应该从那里生成。例如,使用诸如pip-compile https://pypi.org/project/pip-tools/。请参阅此答案底部的注释。
但每个人都有不同的需求,从而导致不同的工作流程。话虽如此...有 3 种可能性来处理这个问题,具体取决于您希望将项目的包元数据写入的位置:pyproject.toml
, setup.cfg
, or setup.py
.
小心的话!
如果您坚持要从包元数据中读取依赖项列表requirements.txt
文件然后确保这个requirements.txt
文件包含在“源代码分发”中(sdist)否则构建(到wheel)并且由于显而易见的原因,后续安装将失败。
这些技术仅适用于简单的requirements.txt
文件。看需求解析在文档页面中pkg_resources https://setuptools.readthedocs.io/en/latest/pkg_resources.html#requirements-parsing获取有关处理内容的详细信息。简而言之,每一行都应该是有效的PEP 508要求 https://www.python.org/dev/peps/pep-0508/. 真正特定于的符号pip https://pip.pypa.io/en/stable/reference/pip_install/#requirements-file-format不支持,会导致失败。
pyproject.toml
[project]
# ...
dynamic = ["dependencies"]
[tool.setuptools.dynamic]
# ...
dependencies = requirements.txt
setup.cfg
从 setuptools 版本 62.6 开始,可以在中编写类似的内容setup.cfg
:
[options]
install_requires = file: requirements.txt
setup.py
可以解析一个相对简单的requirements.txt
文件来自设置工具 setup.py
脚本没有pip. The 设置工具项目中已经包含必要的工具顶层包裹pkg_resources
.
它或多或少看起来像这样:
#!/usr/bin/env python
import pathlib
import pkg_resources
import setuptools
with pathlib.Path('requirements.txt').open() as requirements_txt:
install_requires = [
str(requirement)
for requirement
in pkg_resources.parse_requirements(requirements_txt)
]
setuptools.setup(
install_requires=install_requires,
)
Notes:
- https://github.com/pypa/setuptools/issues/1951#issuecomment-1431345869 https://github.com/pypa/setuptools/issues/1951#issuecomment-1431345869
- https://caremad.io/posts/2013/07/setup-vs-requirement/ https://caremad.io/posts/2013/07/setup-vs-requirement/
- https://setuptools.pypa.io/en/latest/history.html#v62-6-0 https://setuptools.pypa.io/en/latest/history.html#v62-6-0
- 另请参阅另一个答案:https://stackoverflow.com/a/59971469 https://stackoverflow.com/a/59971469