Eerste stappen met uv

Pakketbeheer onder Python kan nogal een rommeltje zijn, een van de klachten die ik in het verleden over Python had. Het is niet ongebruikelijk dat verschillende programma’s niet alleen verschillende pakketten nodig hebben, maar ook compleet verschillende Python-versies. Python zelf heeft virtuele omgevingen om verschillende pakketstructuren voor verschillende programma’s mogelijk te maken, maar dat is mogelijk niet voldoende. Conda is een alternatief dat verschillende Python-versies kan installeren voor verschillende omgevingen, en is de de-facto standaard voor veel machine learning-toepassingen, maar het is niet perfect. Ik zie het vaak gebruikt worden met pip in plaats van met de eigen pakketbeheerder van conda, wat een deel van het voordeel van conda wegneemt, maar de pakketbeheerder van conda kan juist extreem traag zijn.

Meer recent is uv verschenen als alternatief. Het is geschreven in Rust en gebruikt waar mogelijk een gemeenschappelijke pakketcache in plaats van aparte caches voor elke omgeving. Aangezien de systeem-Python op macOS niet wordt aanbevolen voor echt ontwikkelwerk, besloot ik uv hier een kans te geven.

Installatie

De installatie is eenvoudig op alle grote besturingssystemen en wordt hier uitgelegd. Ik heb de standalone installer gebruikt. Je kunt het ook installeren met Homebrew onder macOS of Winget onder Windows, en er is zelfs de optie om een Docker-image te gebruiken.

Daarna moet je een Python-versie installeren, wat gebeurt met uv python install. Het is mogelijk om specifieke Python-versies te installeren:

uv python install 3.14

Scripts uitvoeren

Python-scripts uitvoeren doe je met uv run:

uv run scriptname.py

Werken met projecten

De belangrijkste manier om uv te gebruiken is door in projecten te werken. Dit lijkt sterk op hoe Rust werkt – niet verrassend aangezien uv in Rust is geschreven.

Een nieuw project wordt aangemaakt met uv init. Je kunt het aanroepen met een naam als argument, waardoor een nieuwe map wordt aangemaakt, of binnen een lege map. In beide gevallen wordt een projectstructuur opgezet, inclusief een git-repository en een bestand main.py. Er is ook een bestand pyproject.toml dat metadata en afhankelijkheden bevat, net als een cargo.toml-bestand in een Rust-project.

Pakketten worden vervolgens toegevoegd met uv add pakketnaam. Deze worden toegevoegd aan het pyproject.toml-bestand en geïnstalleerd. In een machine learning-project dat torch gebruikt, installeer je de afhankelijkheden met

uv add torch torchvision

Elke projectmap is een op zichzelf staande virtuele omgeving. Je hoeft dus niet langer handmatig omgevingen te activeren – je gaat gewoon een map in en laat uv run de rest doen.

Je kunt zelfs uv build gebruiken om source- en binaire pakketten van je project te bouwen, waardoor distributie vrij eenvoudig wordt.

Conclusies

Ik twijfelde eerst, omdat ik zo gewend was aan de normale pip-workflow en aan het gebruik van conda onder Linux voor het beheren van virtuele omgevingen. Maar omdat ik een grote fan van cargo ben, was het logisch om uv een kans te geven. Ik vind het erg prettig dat projecten synoniem zijn aan virtuele omgevingen, en dat deze automatisch worden geactiveerd.

 

Een reactie plaatsen

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *