- Veröffentlichungsdatum
uv Python Package Manager
- Autoren

- Name
- Thomas Waldecker
Moderne Software besteht aus vielen externen Bibliotheken. Diese installiert man mit einem Paketmanager. Viele Programmiersprachen haben deshalb eigene Paketmanager oder es gibt Projekte, welche Paketmanager für Programmiersprachen entwickeln.
Für JavaScript gibt es viele verschiedene Paketmanager, die aber eigentlich alle auf die gleichen Paketquellen zugegriffen haben. Aktuell verwenden viele Projekte npm, yarn oder pnpm.
Bei Python war es lange Zeit pip. Leider ist pip nur der "Installer" und es gibt kein Lockfile mit den aufgelösten Abhängigkeiten. Außerdem muss man sein virtuelles Environment (venv) manuell erstellen.
Mit uv gibt es ein Projekt, dass ähnlich wie yarn für JavaScript das Projekt mit Abhängigkeiten komplett verwaltet. Es gibt als Alternative auch noch Poetry und Conda aber diese werden in diesem Artikel nicht betrachtet. Wenn man also von JavaScript kommt und bei pip die ganzen tollen Features vermisst sollte man sich diese Tools ansehen.
Was kann uv?
- Verwenden von verschiedenen Python-Versionen je Projekt. Der Python interpreter muss nicht mehr Global installiert werden. Wenn eine nicht vorhandene Version im Projekt gefordert wird, installiert uv automatisch die richtige Version (vgl.
nvm). Falls die geforderte Version bereits existiert, wird diese benutzt. - Mit einem Lockfile (
uv.lock) werden die aufgelösten Abhängigkeiten festgeschrieben. Alle weiteren Installationen verwenden genau diese Dependencies (vgl.yarn.lock,package-lock.json). - Es wird automatisch ein Virtuelles Environment erstellt und verwendet, ohne dass sich die Shell verändert. Zum ausführen muss man Skripte mit
uvstatt mitpythonstarten. - Die Verwendeten Abhängigkeiten stehen zusammen mit der benötigten Python-Version in der Datei
pyproject.toml. Falls beim Start des Projekts die Abhängigkeiten fehlen, werden diese installiert (vgl.package.json).
Wie verwendet man uv?
uv installiert man entweder im System oder man verwendet es im nix Flake.
Die offizielle Installationsanleitung ist hier: https://docs.astral.sh/uv/.
Ein nix flake kann so aussehen:
{
description = "nix Python uv development flake";
inputs.nixpkgs.url = "github:NixOS/nixpkgs";
outputs = { self, nixpkgs }:
let
supportedSystems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
forEachSupportedSystem = f: nixpkgs.lib.genAttrs supportedSystems (system: f {
pkgs = import nixpkgs { inherit system; config.allowUnfree = true;};
});
in
{
devShells = forEachSupportedSystem ({ pkgs }: {
default = pkgs.mkShell {
packages = with pkgs; [
pkgs.python314
pkgs.uv
];
};
});
};
}
Dieses nix Flake fügt Python 3.14 und uv der aktuellen Umgebung hinzu. uv wird dann dieses Python verwenden. Das startet man dann folgendermaßen.
$ nix develop -c $SHELL
$ uv init uvdemo
Initialized project `uvdemo` at `/.../uvdemo`
$ cd uvdemo
$ ls
README.md main.py pyproject.toml
$ uv add requests
Using CPython 3.14.0 interpreter at: /nix/store/7rai4cm476kqnldsy72v7f6nfvdyj7x3-python3-3.14.0/bin/python3.14
Creating virtual environment at: .venv
Resolved 6 packages in 415ms
Prepared 5 packages in 242ms
Installed 5 packages in 9ms
+ certifi==2025.11.12
+ charset-normalizer==3.4.4
+ idna==3.11
+ requests==2.32.5
+ urllib3==2.5.0
$ uv run main.py
Hello from uvdemo!
Man erhält also mit uv für Python eine ähnlich gute Entwicklungserfahrung wie mit den Tools für JavaScript.