Damit Python-Pakete erstellt werden können (z.B. um sie zu pypi.org hochzuladen), bedarf es einer oder mehrerer Konfigurationsdateien. Sie enthalten Informationen zu dem zu verwendenden Build-Backend und Metadaten zum Projekt. Wenn man sich mit diesem Thema beschäftigt, wird man dabei unter anderem auf folgende drei Dateien stoßen:
setup.pysetup.cfgpyproject.toml
Diese drei Konfigurationsdateien werden in diesem Blogbeitrag erklärt.
Konfigurationsdateien eines Python-Projekts
In einem älteren Artikel zur Struktur eines Python-Projektes bin ich auf die Konfigurationsdateien setup.py und setup.cfg eingegangen. Die Datei setup.cfg enthält alle bezüglich des Projekts erforderlichen Metadaten, während die Datei setup.py, die früher für Metadaten verwendet wurde, sich dann auf zwei Zeilen reduziert. Dabei wird in folgendem Beispiel davon ausgegangen, dass setuptools für das Erstellen von Paketen verwendet werden soll:
import setuptools
setuptools.setup()Die Datei setup.py ist aber mittlerweile als deprecated gekennzeichnet. Die Zukunft gehört der Konfigurationsdatei pyproject.toml. Sie enthält die Informationen zu dem zu verwendenden Build-Backend, wobei vier zur Verfügung stehen:
- Hatchling,
- setuptools,
- Flit und
- PDM.
Sofern setuptools für das Erstellen von Python-Paketen verwendet werden soll, muss die Datei pyproject.toml folgende Angaben enthalten:
[build-system]
requires = ["setuptools>=70.0"]
build-backend = "setuptools.build_meta"Die Datei setup.py ist dann nicht mehr erforderlich. Für die Metadaten könnte jedoch weiterhin die Datei setup.cfg verwendet werden. Nachfolgendes Beispiel zeigt, wie die Datei setup.cfg aufgebaut ist:
[metadata]
name = my_project
author =
author-email =
license =
long_description = file: README.md
url = https://
requires-python = >= 3.12
classifiers =
License :: OSI Approved :: MIT License
Operating System :: OS Independent
Programming Language :: Python :: 3
Programming Language :: Python :: 3.12
Programming Language :: Python :: 3.13
Programming Language :: Python :: Implementation :: CPythonEs ist aber auch möglich, stattdessen die Metadaten in die Datei pyproject.toml aufzunehmen:
[project]
name = "example_package_YOUR_USERNAME_HERE"
version = "0.0.1"
authors = [
{ name="Example Author", email="author@example.com" },
]
description = "A small example package"
readme = "README.md"
requires-python = ">=3.12"
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
]In diesem Fall kann setup.cfg weggelassen werden. Das Python-Projekt hat dann nur noch eine Konfigurationsdatei: pyproject.toml.
Verteilungspakete erstellen
Sofern alle Voraussetzungen erfüllt sind (pyproject.toml, README.md, Lizenz-Info, etc.), kann ein Verteilungspaket (distribution package) erstellt werden. Dabei handelt es sich um ein Archiv, das zu einem Paket-Index (z.B. pypi.org) hochgeladen und mit pip installiert werden kann.
Voraussetzung ist, dass auf dem System build installiert ist (und setuptools, falls es als Build-Backend verwendet werden soll).
# Linux/macOS
python3 -m pip install --upgrade build
# Windows
py -m pip install --upgrade buildDer Build-Prozess kann dann mit folgender Anweisung gestartet werden:
# Linux/macOS
python3 -m build
# Windows
py -m buildDies erstellt das Verzeichnis dist, in dem sich die Source-Datei (Endung tar.gz) und die Build-Datei (Endung whl) befindet. Das Programm pip greift für die Installation eines Pakets grundsätzlich auf die whl-Datei zu. Die Source-Datei wird als Fallback verwendet.
Fazit
- Ein Python-Projekt kann zwei Konfigurationsdateien enthalten:
pyproject.tomlundsetup.cfg. - Die Datei
setup.pyist heutzutage nicht mehr erforderlich. - Sofern alle Informationen (Build-Backend und Metadaten) in eine Datei, also
pyproject.toml, aufgenommen werden, kann die Dateisetup.cfgwegfallen. - Das Bauen der Verteilungspakete erfolgt mit
build. - Als Ergebnis erhält man einen dist-Ordner mit zwei Dateien (tar.gz. und whl).
Weiterführende Links
- Configuring setuptools using pyproject.toml files
- Die Struktur eines Python-Projekts
- Shellskript, das ein neues Python-Projekt mit den dafür erforderlichen Dateien erstellt (macOS).