Erstens glaube ich, dass das Parsing requirements.txt
um die Liste der Abhängigkeiten in den Paketmetadaten zu füllen, ist keine gute Idee. Die requirements.txt
Datei und die Liste der "Installationsabhängigkeiten" sind zwei verschiedene Konzepte, sie sind nicht austauschbar . Es sollte umgekehrt sein, die Liste der Abhängigkeiten in den Paketmetadaten sollte als eine Art Quelle der Wahrheit betrachtet werden, und Dateien wie requirements.txt
sollte von dort aus generiert werden. Zum Beispiel mit einem Werkzeug wie pip-compile
. Siehe die Anmerkungen am Ende dieser Antwort.
Aber jeder hat andere Bedürfnisse, die zu unterschiedlichen Arbeitsabläufen führen. Damit ist also gesagt... Es gibt 3 Möglichkeiten, dies zu handhaben, je nachdem, wo Sie die Paket-Metadaten Ihres Projekts schreiben wollen: pyproject.toml
, setup.cfg
或いは setup.py
.
Ein Wort der Warnung!
Wenn Sie darauf bestehen, dass die Liste der Abhängigkeiten in den Paketmetadaten aus einer requirements.txt
Datei, dann stellen Sie sicher, dass diese requirements.txt
Datei ist in der "source distribution" enthalten ( sdist ), sonst schlägt die Installation aus offensichtlichen Gründen fehl.
Diese Techniken funktionieren nur bei einfachen requirements.txt
Dateien. Siehe Analyse der Anforderungen auf der Dokumentationsseite für pkg_resources
um Einzelheiten darüber zu erfahren, was gehandhabt wird. Kurz gesagt, jede Zeile sollte eine gültige PEP 508 Anforderung . Notationen, die wirklich spezifisch sind für pip werden nicht unterstützt und führen zu einem Fehler.
pyproject.toml
[project]
# ...
dynamic = ["dependencies"]
[tool.setuptools.dynamic]
# ...
dependencies = requirements.txt
setup.cfg
Seit setuptools Version 62.6 ist es möglich, etwas wie dieses in setup.cfg
:
[options]
install_requires = file: requirements.txt
setup.py
Es ist möglich, eine relativ einfache requirements.txt
Datei aus einer setuptools setup.py
Skript ohne pip . Die setuptools Projekt enthält bereits die notwendigen Werkzeuge in seinem oberste Ebene Paket pkg_resources
.
Das könnte mehr oder weniger so aussehen:
#!/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,
)
Anmerkungen :