Hinzufügen weiterer Python-Bibliotheken

Obwohl Pythons „Batteries included“-Philosophie bedeutet, dass ihr mit der Standardinstallation von Python bereits eine Menge machen könnt, wird unweigerlich die Situation kommen, in der ihr eine Funktionalität benötigt, die nicht in Python enthalten ist.

Wenn ihr ein Modul eines Drittanbieters benötigt, das nicht für eure Plattform vorgefertigt ist, müsst ihr dessen Quelldistribution verwenden. Dies bringt jedoch zwei Probleme mit sich:

  1. Um die Quelldistribution zu installieren, müsst ihr sie finden und herunterladen.

  2. Es werden bestimmte Python-Pfade und Berechtigungen eures Systems erwartet.

Python bietet pip als aktuelle Lösung für beide Probleme an. pip versucht, das Modul im Python Package Index (PyPI) zu finden, lädt es und alle Abhängigkeiten herunter und kümmert sich um die Installation. Ihr könnt auch pypi.org direkt aufrufen und nach Paketen zu suchen oder die Pakete nach Kategorien filtern.

Warnung

Installiert niemals irgendetwas mit pip in das globale Python, auch nicht mit dem --user Flag. Verwendet immer venv. So vermeidet ihr, dass eure Python-Installation mit Bibliotheken verunreinigt wird, die ihr installiert und dann vergesst. Jedes Mal, wenn ihr etwas Neues machen müsst, solltet ihr eine neue virtuelle Umgebung erstellen. Damit vermeidet ihr auch Bibliothekskonflikte zwischen verschiedenen Projekten.

Tipp

wir empfehlen euch, pip so zu konfigurieren, dass es nicht möglich ist, Python-Pakete global zu installieren. Hierfür könnt ihr folgendes in eure ~/.config/pip/pip.conf eintragen:

[global]
require-virtualenv = true

venv

Eine virtuelle Umgebung (virtualenv) ist eine in sich geschlossene Verzeichnisstruktur, die sowohl eine Installation von Python als auch die zusätzlichen Pakete enthält. Da die gesamte Python-Umgebung in diesem Verzeichnis enthalten ist, können die dort installierten Bibliotheken und Module nicht mit denen im Hauptsystem oder in anderen virtuellen Umgebungen kollidieren, so dass verschiedene Anwendungen unterschiedliche Versionen von Python und seinen Paketen verwenden können. Das Erstellen und Verwenden einer virtuellen Umgebung erfolgt in zwei Schritten:

  1. Zuerst erstellen wir die Umgebung:

    $ python3 -m venv myenv
    
    > py -m venv myenv
    

    Hiermit wird die Umgebung mit Python und pip in einem Verzeichnis namens myenv erstellt.

  2. Anschließend könnt ihr diese Umgebung aktivieren, sodass beim nächsten Aufruf von python das Python aus eurer neuen Umgebung verwendet wird:

    $ . myenv/bin/activate
    
    > myenv\Scripts\activate.bat
    

#. Python-Pakete nur für diese virtuelle Umgebung installieren, z.B. die beliebte pandas-Bibliothek:

(myenv) $ python -m pip install pandas
(myenv) > python.exe -m pip install pandas
  1. Wenn ihr eure Arbeit an diesem Projekt beenden wollt, könnt ihr die virtuelle Umgebung wieder deaktivieren mit

    (myenv) $ deactivate
    
    (myenv) > deactivate
    

pip

Die grundlegende Syntax von pip ist recht einfach:

$ python -m pip install pandas

Wenn ihr eine bestimmte Version eines Pakets angeben wollt, könnt ihr die Versionsnummern einfach anhängen:

$ python -m pip install pandas==2.2.2

oder

$ python -m pip install "pandas>=2"

Proxy-Server

Um Python-Pakete über einen Proxy-Server zu installieren, könnt ihr folgendes eingeben: python -m pip install --proxy http://USER_NAME:{PASSWORD}@PROXYSERVER_NAME:PORT PKG_NAME

Ihr könnt den Proxy-Server auch dauerhaft als Umgebungsvariable speichern:

z.B. in der ~/.bashrc mit:

export HTTP_PROXY=http://{USER_NAME}:{PASSWORD}@{PROXYSERVER_NAME}:{PORT}

Fügt die folgende Zeile den Umgebungsvariablen hinzu:

set HTTP_PROXY={PROXYSERVER_NAME}:{PORT}

Festschreiben der Versionsnummern

… von Paketen

Für eine stabile Umgebung ist es sinnvoll, die Versionsnummern der Abhängigkeiten festzuschreiben.

Tipp

In keinem unserer Bibliotheksprojekte passiert so viel, dass die Git-History vorwiegend aus Updates bestehen sollte. Lediglich bei Problemen schränken wir dort die zu verwendenden Versionsnummern ein. Bei Anwendungen (engl.: Apps) schreiben wir die Versionsnummern jedoch fest.

Um für unsere Anwendungen die Versionen festzuschreiben und plattformübergreifende Lock-Dateien zu erhalten, verwenden wir PDM. Zudem unterstützt PDM die Verwaltung virtueller Umgebungen mit pdm venv activate.

… von Python

Im Gegensatz zu Anwendungen unterstützen unsere Pakete normalerweise mehr als eine Python-Version. Dennoch fügen wir auch bei Paketen üblicherweise die aktuelle Standard-Version in .python-version hinzu:

.python-version
3.12

Das Schöne daran ist, dass wir die gleiche Datei in GitHub Actions als Eingabe für setup-python verwenden können:

.github/workflows/ci.yml
  docs:
    name: Build docs and check links
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-python@v5
      with:
        # Keep in sync with .readthedocs.yaml
        python-version-file: .python-version

In unseren GitLab CI/CD-Pipelines verwenden wir jedoch requires-python aus der pyproject.toml-Datei, um Docker-Container mit der passenden Python-Version zu bauen.

uv

uv vereinfacht das Erstellen einer initialen Projektstruktur und die Verwaltung eurer Abhängigkeiten.

Installation

uv hängt nicht von von Python ab. Vorkompilierte, eigenständige Binärdateien können auf Linux, macOS und Windows installiert werden:

$ curl -LsSf https://astral.sh/uv/install.sh | sh
> powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

uv aktualisiert sich bei dieser Installation regelmäßig selbst.

Automatische Shell-Vervollständigung

Um die automatische Shell-Vervollständigung für uv-Befehle zu aktivieren, führt einen der folgenden Schritte aus:

Bestimmt eure Shell, z.B. mit echo $SHELL, dann führt einen der folgenden Befehle aus:

$ echo 'eval "$(uv generate-shell-completion bash)"' >> ~/.bashrc
$ echo 'eval "$(uv generate-shell-completion zsh)"' >> ~/.zshrc
$ echo 'uv generate-shell-completion fish | source' >> ~/.config/fish/config.fish
$ echo 'eval (uv generate-shell-completion elvish | slurp)' >> ~/.elvish/rc.elv
Add-Content -Path $PROFILE -Value '(& uv generate-shell-completion powershell) | Out-String | Invoke-Expression'
Add-Content -Path $PROFILE -Value '(& uvx --generate-shell-completion powershell) | Out-String | Invoke-Expression'

Startet dann die Shell neu oder ruft source mit eurer Shell-Konfigurationsdatei ein.

Projektstruktur erstellen

Je nachdem, ob ihr eine Bibliothek oder Anwendung erstellen wollt, kann uv eine passende Projektstruktur erstellen.