Logo von Thomas Waldecker Software Engineering
Veröffentlichungsdatum

uv Python Package Manager

Autoren
  • avatar
    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 uv statt mit python starten.
  • 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.

Weitere Informationen