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.py
setup.cfg
pyproject.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 :: CPython
Es 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 build
Der Build-Prozess kann dann mit folgender Anweisung gestartet werden:
# Linux/macOS
python3 -m build
# Windows
py -m build
Dies 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.toml
undsetup.cfg
. - Die Datei
setup.py
ist heutzutage nicht mehr erforderlich. - Sofern alle Informationen (Build-Backend und Metadaten) in eine Datei, also
pyproject.toml
, aufgenommen werden, kann die Dateisetup.cfg
wegfallen. - 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).