Apps

App-Projekte sind für Webserver, Skripte und Befehlszeilenschnittstellen (CLI) geeignet. Auch sie können wir mit uv init --package erstellen:

$ uv init --package myapp
tree myapp -a
myapp
├── .git
│   └── ...
├── .gitignore
├── .python-version
├── README.md
├── pyproject.toml
└── src
    └── myapp
        └── __init__.py
myapp/pyproject.toml

Die Datei pyproject.toml enthält einen scripts-Einstiegspunkt myapp:main:

myapp/pyproject.toml
[project.scripts]
myapp = "myapp:main"
myapp/src/myapp/__init__.py

Das Modul definiert eine CLI-Funktion main():

myapp/src/myapp/__init__.py
def main() -> None:
    print("Hello from myapp!")

Sie kann mit uv run aufgerufen werden:

$ uv run mypapp
Hello from myapp!

Alternativ könnt ihr auch eine virtuelle Umgebung bauen und dann main() aus Python heraus aufrufen:

$  uv add --dev .
Resolved 1 package in 1ms
Audited in 0.01ms
>>> import myapp
>>> myapp.main()
Hello from myapp!

Bemerkung

Ich bin der festen Überzeugung, dass eine Python-Anwendung richtig gepackt sein sollte, um die vielen Vorteile zu genießen, wie z.B.:

  • die Ressourcenverwaltung mit importlib

  • mit project.scripts ausführbare Skripte anstelle angehängter scripts-Ordner

  • die Vorteile des src-Layouts mit einer allgemeinen, dokumentierten und gut verstandenen Struktur.

uv.lock-Datei

Mit uv add --dev . wurde auch die uv.lock-Datei neben der pyproject.toml-Datei erstellt. uv.lock ist ein plattformübergreifendes Lockfile, das die Pakete erfasst, die über alle möglichen Python-Merkmale wie Betriebssystem, Architektur und Python-Version installiert werden sollen.

Im Gegensatz zur pyproject.toml, die die allgemeinen Anforderungen eures Projekts spezifiziert, enthält uv.lock die genauen aufgelösten Versionen, die in der Projektumgebung installiert sind. Diese Datei sollte in die Versionskontrolle Git eingecheckt werden, um konsistente und reproduzierbare Installationen auf verschiedenen Rechnern zu ermöglichen.

myapp/uv.lock
version = 1
requires-python = ">=3.13"

[[package]]
name = "myapp"
version = "0.1.0"
source = { editable = "." }

[package.metadata]

[package.metadata.requires-dev]
dev = [{ name = "myapp", editable = "." }]

uv.lock ist eine für Menschen lesbare TOML-Datei, wird aber von uv verwaltet und sollte nicht manuell bearbeitet werden.

Bemerkung

Wenn uv in andere Tools oder Workflows integriert werden soll, könnt ihr die Inhalte mit uv export --format requirements-txt > CONSTRAINTS.TXT in das Requirements File Format exportieren. Umgekehrt kann die erzeugte CONSTRAINTS.TXT-Datei dann mit uv pip install oder anderen Tools verwendet werden.

Siehe auch

Aktualisieren von uv.lock

uv.lock wird regelmäßig beim Aufruf von uv sync und uv run aktualisiert.

--frozen

lässt die uv.lock-Datei unverändert.

--no-sync

vermeidet die Aktualisierung der Umgebung während uv run-Aufrufen.

--locked

stellt sicher, dass das Lockfile mit den Projekt-Metadaten übereinstimmt. Wenn das Lockfile nicht aktuell ist, wird eine Fehlermeldung ausgegeben, anstatt das Lockfile zu aktualisieren.

Standardmässig bevorzugt uv bei der Ausführung von uv sync und uv lock die gesperrten Versionen der Pakete. Paketversionen werden nur geändert, wenn die Abhängigkeitsbedingungen des Projekts die vorherige, gesperrte Version ausschließen.

uv lock --upgrade

aktualisiert alle Pakete.

uv lock --upgrade-package PACKAGE==VERSION

aktualisiert ein einzelnes Paket auf eine bestimmte Version.

Ihr könnt auch mit dem pre-commit-Framework regelmäßig eure eure uv.lock-Datei aktualisieren:

.pre-commit-config.yaml
- repo: https://github.com/astral-sh/uv-pre-commit
  rev: 0.4.24
  hooks:
    - id: uv-lock

Plattform- und Python-Versionen einschränken

Wenn euerProjekt nur eine begrenzte Anzahl von Plattformen oder Python-Versionen unterstützt, könnt ihr dies in der pyprojects.toml-Datei PEP 508-konform tun, z.B. um die uv.lock-Datei nur auf macOS und Linux einzuschränken:

[tool.uv]
environments = [
    "sys_platform == 'darwin'",
    "sys_platform == 'linux'",
]