Python UV: De ultieme gids voor de snelste Python-packagemanager
Leer hoe je UV gebruikt, de snelste Python-packagemanager in 2026. Ontdek 10x snellere dependencybeheer, virtuele omgevingen en naadloze migratie vanaf pi
UV is een moderne, high-performance Python-packagemanager en -installer, geschreven in Rust. Het is een drop-invervanging voor traditionele tooling zoals pip, met aanzienlijke verbeteringen in snelheid, betrouwbaarheid en dependency-resolutie.
Deze tool vertegenwoordigt een nieuwe generatie Python-packagemanagers, ontworpen om veelvoorkomende pijnpunten in het Python-ecosysteem aan te pakken, zoals trage installaties, dependencyconflicten en complexe omgevingsbeheer. UV bereikt dit met een innovatieve architectuur en efficiënte implementatie, waardoor het 10–100 keer sneller is dan traditionele packagemanagers.
Belangrijke features die UV laten opvallen:
Bliksemsnelle pakketinstallatie en dependency-resolutie
Compatibel met bestaande Python-tools en -workflows
Ingebouwd beheer van virtuele omgevingen
Ondersteuning voor moderne packaging-standaarden
Betrouwbare dependency locking en reproduceerbare omgevingen
Geheugenefficiënte werking, vooral voor grote projecten
Of je nu aan kleine persoonlijke projecten werkt of grootschalige Python-applicaties beheert, UV biedt een robuuste en efficiënte oplossing voor packagemanagement. In deze tutorial behandelen we alle essentiële aspecten van UV, zodat je er direct mee aan de slag kunt.
TL;DR
UV is een door Rust aangedreven Python-packagemanager die 10–100x sneller is dan pip
Installeer met curl -LsSf https://astral.sh/uv/install.sh | sh
Initialiseer projecten met uv init en voeg dependencies toe met uv add package
Voer scripts uit met uv run script.py—zonder handmatige activatie van een virtuele omgeving
UV vervangt pip, virtualenv, pyenv en pip-tools in één tool
Lockbestanden (uv.lock) zorgen voor reproduceerbare omgevingen op verschillende machines
Gebruik uvx om CLI-tools zoals black en ruff te draaien zonder permanente installatie
Het verschil tussen UV, Poetry, PIP, Conda en virtualenv
De eerste vraag die developers vaak stellen voordat ze overstappen naar een nieuwe tool is: "Hoe verhoudt dit zich tot wat ik al gebruik?" In de wereld van Python-dependency- en projectbeheer zijn deze vier tools al het meest gangbaar:
Laten we UV met elk van deze tools vergelijken om je te helpen beslissen of UV voor jouw behoeften de juiste keuze is, voordat we de details induiken.
UV vs. PIP en virtualenv
PIP en virtualenv zijn de traditionele tools voor Python-packagemanagement en het aanmaken van virtuele omgevingen. Hoewel ze het werk doen, biedt UV een aantal overtuigende voordelen:
Snelheid: dankzij de Rust-implementatie is UV aanzienlijk sneller dan PIP bij pakketinstallatie en dependency-resolutie; taken die met PIP minuten duren, zijn met UV vaak in seconden klaar.
Geïntegreerd omgevingsbeheer: waar virtualenv alleen omgevingen aanmaakt en PIP alleen pakketten beheert, combineert UV beide in één tool en stroomlijnt zo de workflow.
UV behoudt volledige compatibiliteit met het PIP-ecosysteem en pakt tegelijk de belangrijkste beperkingen aan. Het kan dezelfde requirements.txt-bestanden en package-indexen gebruiken, wat migratie naadloos maakt. De belangrijkste verschillen zijn:
Performance: parallelle downloads en een geoptimaliseerde dependency-resolver maken UV 10–100x sneller dan PIP voor grote projecten.
Geheugengebruik: UV gebruikt aanzienlijk minder geheugen dan PIP tijdens installatie en dependency-resolutie.
Foutafhandeling: UV geeft duidelijkere foutmeldingen en betere conflictoplossing bij botsende dependencies.
Reproduceerbaarheid: met lockfiles zorgt UV voor consistente omgevingen op verschillende systemen—iets wat met een eenvoudige requirements.txt niet gegarandeerd is.
Hoewel PIP en virtualenv bruikbare opties blijven, maken UV’s moderne architectuur en gecombineerde functionaliteit het een aantrekkelijk alternatief voor developers die betere performance en een gestroomlijnde workflow zoeken. Dat je UV in bestaande projecten kunt inzetten zonder processen te verstoren, maakt het extra interessant voor teams die hun Python-tooling geleidelijk willen moderniseren.
UV vs. Conda
Wie geen PIP en virtualenv gebruikt, komt vaak bij Conda uit, en dat is niet zonder reden:
Conda biedt een complete packagemanagementoplossing die niet alleen Python-pakketten maar ook systeemafhankelijke libraries beheert
Het blinkt uit in het beheren van complexe scientific computing-omgevingen met pakketten als NumPy, SciPy en TensorFlow
Conda-omgevingen zijn beter geïsoleerd en reproduceerbaar over verschillende besturingssystemen
Het heeft ingebouwde ondersteuning voor verschillende Python-versies en schakelt daar makkelijk tussen
De Anaconda-distributie wordt geleverd met veel voorgeïnstalleerde wetenschappelijke pakketten, handig voor data scientists
Maar zelfs doorgewinterde Conda-gebruikers zouden UV moeten overwegen, om verschillende redenen. (Voor een bredere vergelijking van omgevingsbeheertools, zie Anaconda vs Python: Exploring Their Differences.) UV’s razendsnelle installatie en dependency-resolutie kunnen het opzetten van omgevingen drastisch versnellen ten opzichte van Conda’s soms trage performance. Dankzij de minimale resourcefootprint gebruikt het minder geheugen en start het sneller op. UV integreert ook naadloos met bestaande Python-packagingstandaarden en -tools, waardoor werken met het bredere Python-ecosysteem eenvoudiger wordt. Voor projecten die Conda’s non-Python-packages niet nodig hebben, biedt UV een gestroomlijnde, efficiënte oplossing die de ontwikkelworkflow aanzienlijk kan verbeteren.
UV vs. Poetry
Ik gebruikte bijna drie jaar Conda, maar nadat ik Poetry een paar keer had geprobeerd, raakte ik turtle-slow Conda niet meer aan. Net toen ik me prettig begon te voelen bij Poetry, kwam ik UV tegen—en dat biedt bijna dezelfde mogelijkheden als Poetry:
Dependencybeheer: beide tools beheren pakketafhankelijkheden en virtuele omgevingen effectief
Projectstructuur: beide bieden tooling voor het initialiseren en structureren van Python-projecten
Lockfiles: beide genereren lockfiles voor reproduceerbare omgevingen
Pakketpublicatie: beide ondersteunen publiceren naar PyPI
Moderne tooling: beide vertegenwoordigen een moderne aanpak van Python-projectbeheer
Het onderscheidende kenmerk van UV is echter de extreem hoge snelheid en het minimale resourcegebruik. Hoewel Poetry een grote stap vooruit is ten opzichte van traditionele tools, tilt UV de performance naar een hoger niveau dankzij de Rust-implementatie. Bovendien kan UV, dankzij compatibiliteit met bestaande Python-packaging, samenwerken met andere tools zoals pip—die flexibiliteit ontbreekt soms bij Poetry’s meer uitgesproken aanpak.
Hier is een tabel die de verschillen samenvat die we net hebben besproken:
Feature
UV
PIP + virtualenv
Conda
Poetry
Implementatie
Rust
Python
Python
Python
Snelheid
10–100x sneller dan pip
Baseline
Langzamer dan pip
Sneller dan pip
Geheugengebruik
Zeer efficiënt
Hoger
Hoog
Gemiddeld
Omgevingsbeheer
Ingebouwd
Aparte tools nodig
Ingebouwd
Ingebouwd
Dependency-resolutie
Snelle, moderne resolver
Basis
Omvattend
Moderne resolver
Non-Pythonpakketten
Nee
Nee
Ja
Nee
Lockfiles
Ja
Nee (basis requirements.txt)
Ja
Ja
Projectstructuur
Ja
Nee
Nee
Ja
Pakketpublicatie
Ja
Ja (met twine)
Ja
Ja
Compatibiliteit
Werkt met bestaand pip-ecosysteem
Standaard Python-tool
Eigen ecosysteem
Meer uitgesproken aanpak
Foutafhandeling
Duidelijke foutmeldingen
Basis
Goed
Goed
Resourcefootprint
Minimaal
Gemiddeld
Zwaar
Gemiddeld
Focus op wetenschappelijke computing
Nee
Nee
Ja
Nee
Cross-platform consistentie
Ja
Beperkt
Uitstekend
Goed
Denk je dat UV het waard is om naar over te stappen? Lees dan verder.
Aan de slag met UV voor Python-projecten
In deze sectie behandelen we hoe je vanaf nul een project start met UV. Heb je eerst hulp nodig bij het inrichten van je Python-ontwikkelomgeving? Bekijk dan onze aparte gids. We bespreken later hoe je bestaande projecten naar UV migreert.
UV installeren
UV kan systeemwijd worden geïnstalleerd met cURL op macOS en Linux:
Als je UV via Homebrew hebt geïnstalleerd, gebruik dan brew upgrade uv. Je kunt ook shell-autocompletion inschakelen voor UV-commando’s:
$ echo'eval "$(uv generate-shell-completion zsh)"'>> ~/.zshrc # Voor Zsh
$ echo'eval "$(uv generate-shell-completion bash)"'>> ~/.bashrc # Voor BashMogelijk gemaakt door
Een nieuw project initialiseren
Werken aan projecten is de kern van de UV-ervaring. Je begint met het initialiseren van een leeg project met het commando uv init:
$ uv init explore-uv
Initialized project explore-uv at /Users/bexgboost/projects/explore-uvMogelijk gemaakt door
Het commando maakt direct een nieuwe map explore-uv aan met de volgende inhoud:
$ cd explore-uv
$ tree -a.
├── .gitignore
├── .python-version
├── README.md
├── hello.py
└── pyproject.tomlMogelijk gemaakt door
Git wordt automatisch geïnitialiseerd en belangrijke gitbestanden zoals .gitignore en een lege README.md worden gegenereerd. Het bestand .python-version bevat de Python-versie die voor het project wordt gebruikt, en pyproject.toml is het hoofdconfiguratiebestand voor projectmetadata en dependencies. Er wordt ook een voorbeeldbestand hello.py aangemaakt om je snel op weg te helpen.
UV combineert het aanmaken van een omgeving en het installeren van dependencies in één commando: uv add:
$ uv add scikit-learn xgboost
Using CPython 3.9.20 interpreter at: /opt/homebrew/opt/[email protected]/bin/python3.9
Creating virtual environment at: .venv
Resolved 6 packages in1.78s
⠧ Preparing packages... (2/5)
Prepared 5 packages in 1m 23s
Installed 5 packages in 45ms
+ joblib==1.4.2
+ numpy==2.0.2
+ scikit-learn==1.5.2
...Mogelijk gemaakt door
De eerste keer dat je het commando add uitvoert, maakt UV een nieuwe virtuele omgeving aan in de huidige werkmap en installeert daar de opgegeven dependencies. Bij volgende runs hergebruikt UV de bestaande virtuele omgeving en installeert of update het alleen de nieuw gevraagde pakketten. Zo blijft dependencybeheer efficiënt.
Een ander belangrijk proces bij elk add-commando is het resolven van dependencies. UV gebruikt een moderne dependency-resolver die de volledige dependencygraaf analyseert om een compatibele set pakketversies te vinden die aan alle eisen voldoen. Dit helpt versieconflicten te voorkomen en zorgt voor reproduceerbare omgevingen. De resolver houdt rekening met zaken als versieconstraints, Python-versiecompatibiliteit en platformspecifieke vereisten om de optimale set pakketten te bepalen.
UV werkt na elk add-commando ook de bestanden pyproject.toml en uv.lock bij. Zo ziet het TOML-bestand eruit na het installeren van Scikit-learn en XGBoost:
$ cat pyproject.toml
[project]
name ="explore-uv"
version ="0.1.0"
description ="Add your description here"
readme ="README.md"
requires-python =">=3.9"
dependencies =["scikit-learn>=1.5.2",
"xgboost>=2.0.3",
]Mogelijk gemaakt door
Om een dependency uit de omgeving en uit pyproject.toml te verwijderen, kun je het commando uv remove gebruiken. Dit deïnstalleert het pakket en al zijn subdependencies:
Zodra je de benodigde dependencies hebt geïnstalleerd, kun je zoals gebruikelijk aan je Python-scripts werken. Gebruik je VS Code? Bekijk dan onze gids voor het instellen van VS Code voor Python. UV biedt een paar verschillende manieren om Python-code uit te voeren:
Om een Pythonscript direct te draaien, kun je het commando uv run gebruiken gevolgd door de naam van je script, in plaats van de gebruikelijke python script.py-syntaxis:
Het commando run zorgt ervoor dat het script wordt uitgevoerd binnen de virtuele omgeving die UV voor het project heeft aangemaakt.
Scripts draaien met inline dependencies (PEP 723)
UV ondersteunt PEP 723 inline scriptmetadata, waarmee je dependencies rechtstreeks in een Pythonscript kunt declareren. Dit is handig voor losstaande scripts die pakketten nodig hebben zonder een volledig project op te zetten:
# /// script# requires-python = ">=3.11"# dependencies = [# "requests",# "rich",# ]# ///import requests
from rich.console import Console
console = Console()
response = requests.get("https://api.github.com")
console.print(f"GitHub API status: [bold green]{response.status_code}[/bold green]")Mogelijk gemaakt door
Voer het script uit met uv run; UV maakt automatisch een geïsoleerde omgeving aan met de gedeclareerde dependencies:
Dit is vooral krachtig om reproduceerbare scripts met collega’s te delen—iedereen met UV geïnstalleerd kan het script draaien zonder handmatig dependencies te installeren.
Python-versies beheren in UV
Het beheren van Python-versies is een belangrijk onderdeel van dependencybeheer. UV biedt eenvoudige commando’s om te bepalen welke Python-versie je gebruikt. Laten we het commando uv python verkennen.
Python-versies installeren met UV
UV kan Python-versies direct installeren en beheren, waardoor tools zoals pyenv overbodig worden:
$ uv python install3.12
$ uv python install3.113.13# Installeer meerdere versies tegelijkMogelijk gemaakt door
Python-installaties worden opgeslagen in ~/.local/share/uv/python/ en beïnvloeden je systeem-Python niet. Je kunt een project ook vastzetten op een specifieke Python-versie:
Dit werkt het bestand .python-version in je projectmap bij. UV gebruikt deze versie vervolgens voor alle projecthandelingen.
Bestaande Python-versies weergeven
Omdat systemen vaak al Python geïnstalleerd hebben, kan UV deze installaties standaard detecteren. Om bijvoorbeeld alle door UV gedetecteerde Python-versies op je systeem te tonen, gebruik je:
Het commando detecteerde correct mijn via Conda en Brew geïnstalleerde Python-versies.
Python-versies wijzigen voor het huidige project
Je kunt op elk moment van Python-versie wisselen voor je huidige UV-project, zolang de nieuwe versie voldoet aan de specificaties in je pyproject.toml-bestand. Het volgende bestand vereist bijvoorbeeld Python 3.9 en hoger:
Dit betekent dat je de Python-versie in het bestand .python-version mag wijzigen naar elke versie daarboven, zoals 3.11.7. Roep daarna uv sync aan.
Het commando controleert eerst bestaande Python-installaties. Als de gevraagde versie niet wordt gevonden, downloadt en installeert UV deze in het pad /Users/username/.local/share/uv/python. UV maakt ook een nieuwe virtuele omgeving in de projectmap en vervangt de oude.
Het commando uv sync regelt alles automatisch—het maakt de nieuwe virtuele omgeving aan en installeert alle dependencies opnieuw vanuit je pyproject.toml en uv.lock. Een extra installatiestap is niet nodig.
Let op: soms kunnen uv-commando’s Permission Denied-fouten geven. Gebruik in die gevallen sudo op macOS of Linux, of start je opdrachtprompt met administratorrechten op Windows. Een nog betere oplossing is het eigenaarschap van de UV-thuismap aan de gebruiker toe te wijzen:
Sommige Python-pakketten worden blootgesteld als commandlinetools, zoals black voor codeformattering, flake8 voor linting, pytest voor testen, mypy voor typechecking, enzovoort. UV biedt twee speciale interfaces om deze pakketten te beheren:
Wanneer je deze commando’s draait, maakt UV een tijdelijke virtuele omgeving in zijn cache. De gevraagde tool wordt daar geïnstalleerd en uitgevoerd. Met andere woorden: je kunt commandlinetools gebruiken zonder ze in de virtuele omgeving van het project te installeren—dat zorgt voor snellere executie en schonere projectdependencies.
Belangrijke punten over de tool-runinterfaces:
Werkt met elk Python-pakket dat commandlinetools biedt, zoals flake8, mypy, black of pytest
Gecachte omgevingen worden automatisch opgeschoond bij het legen van de UV-cache
Nieuwe gecachte omgevingen worden on-demand aangemaakt wanneer nodig
Perfect voor incidenteel gebruik van developmenttools
Voor tools die je vaak gebruikt, installeer je ze permanent met uv tool install:
$ uv tool install ruff
$ uv tool install black
$ ruff check .# Nu direct beschikbaar in PATHMogelijk gemaakt door
Permanent geïnstalleerde tools zijn globaal beschikbaar via je PATH, zonder een projectomgeving te vervuilen. Je kunt ze updaten met uv tool upgrade ruff en een lijst opvragen met uv tool list.
Lockbestanden (uv.lock) zijn een essentieel onderdeel van dependencybeheer in UV. Wanneer je uv add-commando’s uitvoert om dependencies te installeren, genereert en update UV automatisch een uv.lock-bestand. Dit lockbestand heeft meerdere cruciale doelen:
Het legt de exacte versies vast van alle dependencies en subdependencies die zijn geïnstalleerd.
Het zorgt voor reproduceerbare builds door dependencyversies te “locken” over verschillende omgevingen.
Het helpt “dependency hell” te voorkomen door consistente pakketversies te behouden.
Het versnelt installaties, omdat UV de gelockte versies kan gebruiken in plaats van dependencies opnieuw te resolven.
UV beheert het lockbestand automatisch—je hoeft het niet handmatig aan te passen. Het lockbestand moet je committen in versiebeheer, zodat alle developers dezelfde dependencyversies gebruiken.
Het verschil tussen lockbestanden en requirements.txt
Hoewel zowel lockbestanden als requirements.txt dienen om dependencies vast te leggen, hebben ze verschillende doelen en use-cases. Lockbestanden bevatten gedetailleerde informatie over exacte pakketversies en de volledige dependencyboom, zodat omgevingen consistent blijven tijdens development. Requirements.txt-bestanden zijn eenvoudiger en vermelden meestal alleen directe dependencies; ze worden breed ondersteund door Python-tools.
Lockbestanden zijn essentieel tijdens development om reproduceerbare builds te behouden en dependencyconflicten te voorkomen. Requirements.txt-bestanden zijn geschikter voor deployment-scenario’s of wanneer je code deelt met gebruikers die mogelijk geen UV gebruiken. Ze zijn ook nodig voor compatibiliteit met tools en services die UV’s lockformaat niet ondersteunen.
Je kunt beide bestanden aanhouden door UV’s lockbestand te gebruiken voor development en een requirements.txt te genereren voor deployment. Om een requirements.txt te genereren op basis van een UV-lockbestand, gebruik je het volgende commando:
Hiermee maak je een tekstbestand met gepinde versies op basis van je lockbestand. Zo kun je dependencies van je project in een standaardformaat delen, terwijl je tijdens development profiteert van UV’s geavanceerde dependencybeheer.
In deze sectie verkennen we meer geavanceerde methoden om dependencies te beheren in UV. We leren hoe je dependencies bijwerkt, optioneel maakt of in een dependencygroep plaatst.
Dependencies updaten
In langlopende projecten is het gebruikelijk om gebruikte pakketten te updaten om de meest recente features te krijgen. Soms introduceert een pakket breaking changes en wil je voorkomen dat die versie per ongeluk wordt geïnstalleerd. Het commando add kan opnieuw worden gebruikt in deze en andere scenario’s waarin je constraints of versies van bestaande dependencies wilt wijzigen.
Optionele dependencies zijn pakketten die niet vereist zijn voor de kernfunctionaliteit van je project, maar wel nodig kunnen zijn voor specifieke features. Zo heeft Pandas een excel-extra en een plot-extra om te voorkomen dat Excel-parsers en matplotlib worden geïnstalleerd, tenzij iemand ze expliciet nodig heeft. Optionals installeer je meestal met de syntaxis pip install pandas[plot, excel].
Met UV is die syntaxis net iets anders. Zorg eerst dat het kernpakket Pandas is geïnstalleerd:
Zodra ze zijn geresolved, worden ze in je pyproject.toml als volgt vermeld:
[project]
name = "explore-uv"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.9"
dependencies = ["pandas[plot,excel]>=2.2.3","requests>=2.32.3",]Mogelijk gemaakt door
Dependencygroepen
Met dependencygroepen kun je dependencies organiseren in logische groepen, zoals ontwikkeldependencies, testdependencies of documentatiedependencies. Dit is handig om productiondependencies gescheiden te houden van ontwikkeldependencies.
Om een dependency aan een specifieke groep toe te voegen, gebruik je de vlag --group:
Gebruikers kunnen vervolgens bepalen welke groepen ze willen installeren met de tags --group, --only-group en --no-group.
Overstappen van PIP en Virtualenv naar UV
Migreren van PIP en virtualenv naar UV is eenvoudig, omdat UV compatibel is met bestaande Python-packagingstandaarden. Hier is een stapsgewijze gids om de overgang soepel te laten verlopen:
1. Een bestaand virtualenv-project omzetten
Heb je een bestaand project met virtualenv en pip? Begin dan met het genereren van een requirements.txt uit je huidige omgeving, als je dat nog niet hebt gedaan:
Hier is een snel naslagwerk om veelgebruikte pip- en virtualenv-commando’s te vervangen door hun UV-equivalenten:
pip/virtualenv-commando
UV-equivalent
python -m venv .venv
uv venv
pip install package
uv add package
pip install -r requirements.txt
uv pip install -r requirements.txt
pip uninstall package
uv remove package
pip freeze
uv pip freeze
pip list
uv pip list
Na de migratie kun je je oude virtualenv-map veilig verwijderen en UV’s omgevingsbeheer gaan gebruiken. De overgang verloopt doorgaans naadloos, en je kunt desgewenst altijd terugvallen op pip-commando’s via UV’s pip-compatibiliteitslaag.
UV gebruiken in CI/CD en Docker
De snelheid van UV is vooral waardevol in CI/CD-pipelines, waar bij elke build dependencies worden geïnstalleerd. Hier is een voorbeeldworkflow voor GitHub Actions met UV:
jobs:test:runs-on: ubuntu-latest
steps:-uses: actions/checkout@v4
-name: Install uv
uses: astral-sh/setup-uv@v3
-name: Set up Python
run: uv python install 3.12
-name: Install dependencies
run: uv sync --frozen --dev
-name: Run tests
run: uv run pytest tests/Mogelijk gemaakt door
De vlag --frozen zorgt ervoor dat de CI exact de versies uit je lockbestand gebruikt, en faalt als het lockbestand verouderd is. Dit garandeert reproduceerbare builds.
Docker-integratie
UV kan ook Docker-imagebuilds aanzienlijk versnellen:
FROM python:3.12-slim# Install uvCOPY--from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/WORKDIR /appCOPY pyproject.toml uv.lock ./RUN uv sync --frozen --no-dev --no-editableCOPY . .CMD ["uv", "run", "python", "app.py"]Mogelijk gemaakt door
Door eerst de dependencybestanden te kopiëren en te installeren vóór je de broncode kopieert, profiteer je maximaal van Docker-layercaching. Installatie van dependencies draait alleen opnieuw als pyproject.toml of uv.lock verandert.
Conclusie
UV is een grote stap vooruit in Python-packagemanagement: modern, snel en efficiënt, en een volwaardig alternatief voor traditionele tools. De belangrijkste voordelen zijn:
Bloedssnelle performance met 10–100x snelheidswinst ten opzichte van pip
Naadloze integratie met bestaande Python-packagingstandaarden
Ingebouwd beheer van virtuele omgevingen
Efficiënte dependency-resolutie en lockfiles
Lage geheugen- en resourcefootprint
Of je nu een nieuw project start of een bestaand project migreert, UV biedt een robuuste oplossing die je Python-ontwikkelworkflow aanzienlijk kan verbeteren. Door de compatibiliteit met bestaande tools is het een logische keuze voor developers die hun toolchain willen moderniseren zonder hun huidige processen te verstoren.
Terwijl het Python-ecosysteem zich blijft ontwikkelen, laten tools zoals UV zien hoe moderne technologieën zoals Rust de ontwikkelervaring kunnen verbeteren, terwijl de eenvoud en toegankelijkheid waar Python-ontwikkelaars van houden behouden blijven.
Wil je meer leren over dependencybeheer of Python in het algemeen? Bekijk dan deze extra bronnen:
Is UV sneller dan pip voor Python-packagemanagement?⌄
Ja, UV is aanzienlijk sneller dan pip, met 10–100x snelheidswinst voor pakketinstallatie en dependency-resolutie. Deze performanceboost komt door UV’s Rust-implementatie en geoptimaliseerde parallelle downloads. Vooral bij grote projecten zijn taken die met pip minuten duren met UV binnen seconden klaar.
Kan ik UV gebruiken met bestaande pip-requirements.txt-bestanden?⌄
Ja, UV is volledig compatibel met bestaande pip-requirements.txt-bestanden en kan ze direct importeren met het commando uv pip install -r requirements.txt. UV behoudt compatibiliteit met het Python-packagingecosysteem en biedt tegelijkertijd betere performance en dependencybeheer.
Wat zijn de voordelen van UV ten opzichte van Poetry en Conda?⌄
UV biedt verschillende voordelen ten opzichte van zowel Poetry als Conda:
Snellere performance dankzij de Rust-implementatie
Lager geheugenverbruik en kleinere resourcefootprint
Betere compatibiliteit met bestaande Python-tooling
Eenvoudigere workflow dan Conda
Meer flexibiliteit dan de uitgesproken structuur van Poetry
Hoewel Conda uitblinkt in non-Pythonpakketten en Poetry sterk is in projectbeheer, biedt UV de beste balans tussen snelheid en compatibiliteit.
Ondersteunt UV virtuele omgevingen?⌄
Ja, UV heeft ingebouwd beheer van virtuele omgevingen. Wanneer je in een project voor het eerst uv add draait, maakt het automatisch een virtuele omgeving aan en beheert die voor je. UV combineert het aanmaken van omgevingen en packagemanagement in één tool, wat de Python-workflow stroomlijnt vergeleken met losse tools zoals pip en virtualenv.
Verbeter je datavaardigheden, leer hoe je data kunt bewerken en visualiseren, en gebruik geavanceerde analyses om beslissingen te nemen op basis van data.
Wat is Python UV?
UV is een moderne, high-performance Python-packagemanager en -installer, geschreven in Rust. Het is een drop-invervanging voor traditionele tooling zoals
pip, met aanzienlijke verbeteringen in snelheid, betrouwbaarheid en dependency-resolutie.Deze tool vertegenwoordigt een nieuwe generatie Python-packagemanagers, ontworpen om veelvoorkomende pijnpunten in het Python-ecosysteem aan te pakken, zoals trage installaties, dependencyconflicten en complexe omgevingsbeheer. UV bereikt dit met een innovatieve architectuur en efficiënte implementatie, waardoor het 10–100 keer sneller is dan traditionele packagemanagers.
Belangrijke features die UV laten opvallen:
Of je nu aan kleine persoonlijke projecten werkt of grootschalige Python-applicaties beheert, UV biedt een robuuste en efficiënte oplossing voor packagemanagement. In deze tutorial behandelen we alle essentiële aspecten van UV, zodat je er direct mee aan de slag kunt.
TL;DR
curl -LsSf https://astral.sh/uv/install.sh | shuv initen voeg dependencies toe metuv add packageuv run script.py—zonder handmatige activatie van een virtuele omgevinguv.lock) zorgen voor reproduceerbare omgevingen op verschillende machinesuvxom CLI-tools zoalsblackenruffte draaien zonder permanente installatieHet verschil tussen UV, Poetry, PIP, Conda en virtualenv
De eerste vraag die developers vaak stellen voordat ze overstappen naar een nieuwe tool is: "Hoe verhoudt dit zich tot wat ik al gebruik?" In de wereld van Python-dependency- en projectbeheer zijn deze vier tools al het meest gangbaar:
Laten we UV met elk van deze tools vergelijken om je te helpen beslissen of UV voor jouw behoeften de juiste keuze is, voordat we de details induiken.
UV vs. PIP en
virtualenvPIP en
virtualenvzijn de traditionele tools voor Python-packagemanagement en het aanmaken van virtuele omgevingen. Hoewel ze het werk doen, biedt UV een aantal overtuigende voordelen:virtualenvalleen omgevingen aanmaakt en PIP alleen pakketten beheert, combineert UV beide in één tool en stroomlijnt zo de workflow.UV behoudt volledige compatibiliteit met het PIP-ecosysteem en pakt tegelijk de belangrijkste beperkingen aan. Het kan dezelfde
requirements.txt-bestanden en package-indexen gebruiken, wat migratie naadloos maakt. De belangrijkste verschillen zijn:requirements.txtniet gegarandeerd is.Hoewel PIP en virtualenv bruikbare opties blijven, maken UV’s moderne architectuur en gecombineerde functionaliteit het een aantrekkelijk alternatief voor developers die betere performance en een gestroomlijnde workflow zoeken. Dat je UV in bestaande projecten kunt inzetten zonder processen te verstoren, maakt het extra interessant voor teams die hun Python-tooling geleidelijk willen moderniseren.
UV vs. Conda
Wie geen PIP en
virtualenvgebruikt, komt vaak bij Conda uit, en dat is niet zonder reden:Maar zelfs doorgewinterde Conda-gebruikers zouden UV moeten overwegen, om verschillende redenen. (Voor een bredere vergelijking van omgevingsbeheertools, zie Anaconda vs Python: Exploring Their Differences.) UV’s razendsnelle installatie en dependency-resolutie kunnen het opzetten van omgevingen drastisch versnellen ten opzichte van Conda’s soms trage performance. Dankzij de minimale resourcefootprint gebruikt het minder geheugen en start het sneller op. UV integreert ook naadloos met bestaande Python-packagingstandaarden en -tools, waardoor werken met het bredere Python-ecosysteem eenvoudiger wordt. Voor projecten die Conda’s non-Python-packages niet nodig hebben, biedt UV een gestroomlijnde, efficiënte oplossing die de ontwikkelworkflow aanzienlijk kan verbeteren.
UV vs. Poetry
Ik gebruikte bijna drie jaar Conda, maar nadat ik Poetry een paar keer had geprobeerd, raakte ik turtle-slow Conda niet meer aan. Net toen ik me prettig begon te voelen bij Poetry, kwam ik UV tegen—en dat biedt bijna dezelfde mogelijkheden als Poetry:
Het onderscheidende kenmerk van UV is echter de extreem hoge snelheid en het minimale resourcegebruik. Hoewel Poetry een grote stap vooruit is ten opzichte van traditionele tools, tilt UV de performance naar een hoger niveau dankzij de Rust-implementatie. Bovendien kan UV, dankzij compatibiliteit met bestaande Python-packaging, samenwerken met andere tools zoals
pip—die flexibiliteit ontbreekt soms bij Poetry’s meer uitgesproken aanpak.Hier is een tabel die de verschillen samenvat die we net hebben besproken:
Feature
UV
PIP + virtualenv
Conda
Poetry
Implementatie
Rust
Python
Python
Python
Snelheid
10–100x sneller dan pip
Baseline
Langzamer dan pip
Sneller dan pip
Geheugengebruik
Zeer efficiënt
Hoger
Hoog
Gemiddeld
Omgevingsbeheer
Ingebouwd
Aparte tools nodig
Ingebouwd
Ingebouwd
Dependency-resolutie
Snelle, moderne resolver
Basis
Omvattend
Moderne resolver
Non-Pythonpakketten
Nee
Nee
Ja
Nee
Lockfiles
Ja
Nee (basis requirements.txt)
Ja
Ja
Projectstructuur
Ja
Nee
Nee
Ja
Pakketpublicatie
Ja
Ja (met twine)
Ja
Ja
Compatibiliteit
Werkt met bestaand pip-ecosysteem
Standaard Python-tool
Eigen ecosysteem
Meer uitgesproken aanpak
Foutafhandeling
Duidelijke foutmeldingen
Basis
Goed
Goed
Resourcefootprint
Minimaal
Gemiddeld
Zwaar
Gemiddeld
Focus op wetenschappelijke computing
Nee
Nee
Ja
Nee
Cross-platform consistentie
Ja
Beperkt
Uitstekend
Goed
Denk je dat UV het waard is om naar over te stappen? Lees dan verder.
Aan de slag met UV voor Python-projecten
In deze sectie behandelen we hoe je vanaf nul een project start met UV. Heb je eerst hulp nodig bij het inrichten van je Python-ontwikkelomgeving? Bekijk dan onze aparte gids. We bespreken later hoe je bestaande projecten naar UV migreert.
UV installeren
UV kan systeemwijd worden geïnstalleerd met cURL op macOS en Linux:
En met Powershell op Windows (zorg dat je Powershell met administratorrechten draait):
UV is ook beschikbaar via Homebrew:
Installatie via PIP wordt ondersteund maar niet aanbevolen:
Daarna kun je de installatie verifiëren met
uv version:UV updaten
UV kan zichzelf updaten als het via de standalone-installer is geïnstalleerd:
Als je UV via Homebrew hebt geïnstalleerd, gebruik dan
brew upgrade uv. Je kunt ook shell-autocompletion inschakelen voor UV-commando’s:Een nieuw project initialiseren
Werken aan projecten is de kern van de UV-ervaring. Je begint met het initialiseren van een leeg project met het commando
uv init:Het commando maakt direct een nieuwe map
explore-uvaan met de volgende inhoud:Git wordt automatisch geïnitialiseerd en belangrijke gitbestanden zoals
.gitignoreen een legeREADME.mdworden gegenereerd. Het bestand.python-versionbevat de Python-versie die voor het project wordt gebruikt, enpyproject.tomlis het hoofdconfiguratiebestand voor projectmetadata en dependencies. Er wordt ook een voorbeeldbestandhello.pyaangemaakt om je snel op weg te helpen.Je kunt meer lezen over het maken van projecten in de UV-documentatie.
Initiële dependencies aan het project toevoegen
UV combineert het aanmaken van een omgeving en het installeren van dependencies in één commando:
uv add:De eerste keer dat je het commando
adduitvoert, maakt UV een nieuwe virtuele omgeving aan in de huidige werkmap en installeert daar de opgegeven dependencies. Bij volgende runs hergebruikt UV de bestaande virtuele omgeving en installeert of update het alleen de nieuw gevraagde pakketten. Zo blijft dependencybeheer efficiënt.Een ander belangrijk proces bij elk
add-commando is het resolven van dependencies. UV gebruikt een moderne dependency-resolver die de volledige dependencygraaf analyseert om een compatibele set pakketversies te vinden die aan alle eisen voldoen. Dit helpt versieconflicten te voorkomen en zorgt voor reproduceerbare omgevingen. De resolver houdt rekening met zaken als versieconstraints, Python-versiecompatibiliteit en platformspecifieke vereisten om de optimale set pakketten te bepalen.UV werkt na elk add-commando ook de bestanden
pyproject.tomlenuv.lockbij. Zo ziet het TOML-bestand eruit na het installeren van Scikit-learn en XGBoost:Om een dependency uit de omgeving en uit
pyproject.tomlte verwijderen, kun je het commandouv removegebruiken. Dit deïnstalleert het pakket en al zijn subdependencies:We gaan later dieper in op dependencybeheer.
Python-scripts uitvoeren met UV
Zodra je de benodigde dependencies hebt geïnstalleerd, kun je zoals gebruikelijk aan je Python-scripts werken. Gebruik je VS Code? Bekijk dan onze gids voor het instellen van VS Code voor Python. UV biedt een paar verschillende manieren om Python-code uit te voeren:
Om een Pythonscript direct te draaien, kun je het commando
uv rungebruiken gevolgd door de naam van je script, in plaats van de gebruikelijkepython script.py-syntaxis:Het commando
runzorgt ervoor dat het script wordt uitgevoerd binnen de virtuele omgeving die UV voor het project heeft aangemaakt.Scripts draaien met inline dependencies (PEP 723)
UV ondersteunt PEP 723 inline scriptmetadata, waarmee je dependencies rechtstreeks in een Pythonscript kunt declareren. Dit is handig voor losstaande scripts die pakketten nodig hebben zonder een volledig project op te zetten:
Voer het script uit met
uv run; UV maakt automatisch een geïsoleerde omgeving aan met de gedeclareerde dependencies:Dit is vooral krachtig om reproduceerbare scripts met collega’s te delen—iedereen met UV geïnstalleerd kan het script draaien zonder handmatig dependencies te installeren.
Python-versies beheren in UV
Het beheren van Python-versies is een belangrijk onderdeel van dependencybeheer. UV biedt eenvoudige commando’s om te bepalen welke Python-versie je gebruikt. Laten we het commando
uv pythonverkennen.Python-versies installeren met UV
UV kan Python-versies direct installeren en beheren, waardoor tools zoals
pyenvoverbodig worden:Python-installaties worden opgeslagen in
~/.local/share/uv/python/en beïnvloeden je systeem-Python niet. Je kunt een project ook vastzetten op een specifieke Python-versie:Dit werkt het bestand
.python-versionin je projectmap bij. UV gebruikt deze versie vervolgens voor alle projecthandelingen.Bestaande Python-versies weergeven
Omdat systemen vaak al Python geïnstalleerd hebben, kan UV deze installaties standaard detecteren. Om bijvoorbeeld alle door UV gedetecteerde Python-versies op je systeem te tonen, gebruik je:
Het commando detecteerde correct mijn via Conda en Brew geïnstalleerde Python-versies.
Python-versies wijzigen voor het huidige project
Je kunt op elk moment van Python-versie wisselen voor je huidige UV-project, zolang de nieuwe versie voldoet aan de specificaties in je
pyproject.toml-bestand. Het volgende bestand vereist bijvoorbeeld Python 3.9 en hoger:Dit betekent dat je de Python-versie in het bestand
.python-versionmag wijzigen naar elke versie daarboven, zoals 3.11.7. Roep daarnauv syncaan.Het commando controleert eerst bestaande Python-installaties. Als de gevraagde versie niet wordt gevonden, downloadt en installeert UV deze in het pad
/Users/username/.local/share/uv/python. UV maakt ook een nieuwe virtuele omgeving in de projectmap en vervangt de oude.Het commando
uv syncregelt alles automatisch—het maakt de nieuwe virtuele omgeving aan en installeert alle dependencies opnieuw vanuit jepyproject.tomlenuv.lock. Een extra installatiestap is niet nodig.Let op: soms kunnen
uv-commando’sPermission Denied-fouten geven. Gebruik in die gevallensudoop macOS of Linux, of start je opdrachtprompt met administratorrechten op Windows. Een nog betere oplossing is het eigenaarschap van de UV-thuismap aan de gebruiker toe te wijzen:Wil je meer weten over het beheren van Python-versies met UV? Raadpleeg dan de documentatie.
Wat zijn UV Tools en hoe gebruik je ze?
Sommige Python-pakketten worden blootgesteld als commandlinetools, zoals
blackvoor codeformattering,flake8voor linting,pytestvoor testen,mypyvoor typechecking, enzovoort. UV biedt twee speciale interfaces om deze pakketten te beheren:1. Met
uv tool run:2. Met het kortere en handigere
uvx-commando:Wanneer je deze commando’s draait, maakt UV een tijdelijke virtuele omgeving in zijn cache. De gevraagde tool wordt daar geïnstalleerd en uitgevoerd. Met andere woorden: je kunt commandlinetools gebruiken zonder ze in de virtuele omgeving van het project te installeren—dat zorgt voor snellere executie en schonere projectdependencies.
Belangrijke punten over de tool-runinterfaces:
uv tool install:Permanent geïnstalleerde tools zijn globaal beschikbaar via je
PATH, zonder een projectomgeving te vervuilen. Je kunt ze updaten metuv tool upgrade ruffen een lijst opvragen metuv tool list.Lees de UV Tools-sectie van de documentatie voor meer informatie over deze interfaces.
Wat zijn lockbestanden in UV?
Lockbestanden (
uv.lock) zijn een essentieel onderdeel van dependencybeheer in UV. Wanneer jeuv add-commando’s uitvoert om dependencies te installeren, genereert en update UV automatisch eenuv.lock-bestand. Dit lockbestand heeft meerdere cruciale doelen:UV beheert het lockbestand automatisch—je hoeft het niet handmatig aan te passen. Het lockbestand moet je committen in versiebeheer, zodat alle developers dezelfde dependencyversies gebruiken.
Het verschil tussen lockbestanden en
requirements.txtHoewel zowel lockbestanden als
requirements.txtdienen om dependencies vast te leggen, hebben ze verschillende doelen en use-cases. Lockbestanden bevatten gedetailleerde informatie over exacte pakketversies en de volledige dependencyboom, zodat omgevingen consistent blijven tijdens development. Requirements.txt-bestanden zijn eenvoudiger en vermelden meestal alleen directe dependencies; ze worden breed ondersteund door Python-tools.Lockbestanden zijn essentieel tijdens development om reproduceerbare builds te behouden en dependencyconflicten te voorkomen. Requirements.txt-bestanden zijn geschikter voor deployment-scenario’s of wanneer je code deelt met gebruikers die mogelijk geen UV gebruiken. Ze zijn ook nodig voor compatibiliteit met tools en services die UV’s lockformaat niet ondersteunen.
Je kunt beide bestanden aanhouden door UV’s lockbestand te gebruiken voor development en een
requirements.txtte genereren voor deployment. Om eenrequirements.txtte genereren op basis van een UV-lockbestand, gebruik je het volgende commando:Hiermee maak je een tekstbestand met gepinde versies op basis van je lockbestand. Zo kun je dependencies van je project in een standaardformaat delen, terwijl je tijdens development profiteert van UV’s geavanceerde dependencybeheer.
Lees meer over het beheren van lockbestanden in de documentatie.
Geavanceerd dependencybeheer met UV
In deze sectie verkennen we meer geavanceerde methoden om dependencies te beheren in UV. We leren hoe je dependencies bijwerkt, optioneel maakt of in een dependencygroep plaatst.
Dependencies updaten
In langlopende projecten is het gebruikelijk om gebruikte pakketten te updaten om de meest recente features te krijgen. Soms introduceert een pakket breaking changes en wil je voorkomen dat die versie per ongeluk wordt geïnstalleerd. Het commando
addkan opnieuw worden gebruikt in deze en andere scenario’s waarin je constraints of versies van bestaande dependencies wilt wijzigen.1. De nieuwste versie van een pakket installeren:
2. Een specifieke versie installeren:
3. De grenzen van de constraints van een pakket aanpassen:
4. Een dependency platformspecifiek maken:
Optionele dependencies toevoegen
Optionele dependencies zijn pakketten die niet vereist zijn voor de kernfunctionaliteit van je project, maar wel nodig kunnen zijn voor specifieke features. Zo heeft Pandas een
excel-extra en eenplot-extra om te voorkomen dat Excel-parsers en matplotlib worden geïnstalleerd, tenzij iemand ze expliciet nodig heeft. Optionals installeer je meestal met de syntaxispip install pandas[plot, excel].Met UV is die syntaxis net iets anders. Zorg eerst dat het kernpakket Pandas is geïnstalleerd:
Installeer het daarna met de optionele extras via de blokhaaknotatie:
Zodra ze zijn geresolved, worden ze in je
pyproject.tomlals volgt vermeld:Dependencygroepen
Met dependencygroepen kun je dependencies organiseren in logische groepen, zoals ontwikkeldependencies, testdependencies of documentatiedependencies. Dit is handig om productiondependencies gescheiden te houden van ontwikkeldependencies.
Om een dependency aan een specifieke groep toe te voegen, gebruik je de vlag
--group:Gebruikers kunnen vervolgens bepalen welke groepen ze willen installeren met de tags
--group,--only-groupen--no-group.Overstappen van PIP en Virtualenv naar UV
Migreren van PIP en virtualenv naar UV is eenvoudig, omdat UV compatibel is met bestaande Python-packagingstandaarden. Hier is een stapsgewijze gids om de overgang soepel te laten verlopen:
1. Een bestaand virtualenv-project omzetten
Heb je een bestaand project met
virtualenven pip? Begin dan met het genereren van eenrequirements.txtuit je huidige omgeving, als je dat nog niet hebt gedaan:Maak daarna een nieuw UV-project in dezelfde map:
Installeer tot slot de dependencies uit je requirementsbestand:
2. Veelgebruikte pip/virtualenv-commando’s vervangen
Hier is een snel naslagwerk om veelgebruikte pip- en virtualenv-commando’s te vervangen door hun UV-equivalenten:
pip/virtualenv-commando
UV-equivalent
python -m venv .venvuv venvpip install packageuv add packagepip install -r requirements.txtuv pip install -r requirements.txtpip uninstall packageuv remove packagepip freezeuv pip freezepip listuv pip listNa de migratie kun je je oude virtualenv-map veilig verwijderen en UV’s omgevingsbeheer gaan gebruiken. De overgang verloopt doorgaans naadloos, en je kunt desgewenst altijd terugvallen op
pip-commando’s via UV’spip-compatibiliteitslaag.UV gebruiken in CI/CD en Docker
De snelheid van UV is vooral waardevol in CI/CD-pipelines, waar bij elke build dependencies worden geïnstalleerd. Hier is een voorbeeldworkflow voor GitHub Actions met UV:
De vlag
--frozenzorgt ervoor dat de CI exact de versies uit je lockbestand gebruikt, en faalt als het lockbestand verouderd is. Dit garandeert reproduceerbare builds.Docker-integratie
UV kan ook Docker-imagebuilds aanzienlijk versnellen:
Door eerst de dependencybestanden te kopiëren en te installeren vóór je de broncode kopieert, profiteer je maximaal van Docker-layercaching. Installatie van dependencies draait alleen opnieuw als
pyproject.tomlofuv.lockverandert.Conclusie
UV is een grote stap vooruit in Python-packagemanagement: modern, snel en efficiënt, en een volwaardig alternatief voor traditionele tools. De belangrijkste voordelen zijn:
Of je nu een nieuw project start of een bestaand project migreert, UV biedt een robuuste oplossing die je Python-ontwikkelworkflow aanzienlijk kan verbeteren. Door de compatibiliteit met bestaande tools is het een logische keuze voor developers die hun toolchain willen moderniseren zonder hun huidige processen te verstoren.
Terwijl het Python-ecosysteem zich blijft ontwikkelen, laten tools zoals UV zien hoe moderne technologieën zoals Rust de ontwikkelervaring kunnen verbeteren, terwijl de eenvoud en toegankelijkheid waar Python-ontwikkelaars van houden behouden blijven.
Wil je meer leren over dependencybeheer of Python in het algemeen? Bekijk dan deze extra bronnen: