Har du stått på en scene klar for å holde presentasjon, du plugger inn HDMI kabelen - ingenting skjer? Mørk skjerm, høy puls, mild panikk. Du står der og banker lett på laptopen i håp om at det skal hjelpe. Det er kun én oppgave den kabelen har.
Dette er akkurat den følelsen jeg har hatt i mange Python-prosjekter. Du installerer pakkenene, du gjør alt "riktig", men fortsatt er det ett eller annet som stopper fordi pip / PATH / Python-versjon har andre planer. Det er noen ting som bare MÅ funke.
Etter at jeg oppdaget uv, har denne delen av hverdagen gått fra stress til strålende.

Hvorfor blir det tull
Hvis du har brukt Python en stund, har du sannsynligvis det jeg liker å kalle historisk bagasje 🧳 Du installerte Python 3.9 på maskinen din en gang, fikk et virtuelt miljø til å fungere, og siden ble det alltid sånn. Alt er greit helt til du plutselig åpner et prosjekt som krever 3.12, og så begynner runddansen:
Du kjører kanskje
brew install python@3.12
og deretter
python --version
Du får tilbake “python 3.9”. Hmmmm hvordan var dette igjen? Noe med PATH, litt googling, kanskje du må forhøre deg med ChatGPT for å finne ut hva du har glemt. Det har jeg gjort mange ganger.
Parallelt skjer det samme med pakkene i prosjektet ditt: teamet blir enige om å ha en requirements.txt-fil der alle må huske å legge inn pakkene de bruker 🤡
Dette fungerer sjelden - plutselig dukker det opp
ModuleNotFoundError: No module named 'fastapi'- noen må ha glemt å oppdatere 😠
Så hva er det uv faktisk løser
uv finner ikke opp hjulet på nytt – den samler heller konsepter fra verktøyer du allerede bruker og får hele oppsettet til å fungere sammen slik det burde. Det som gjør uv så bra er at:
🐍 Python-versjoner installeres og styres i prosjektet (slutt på "hvilken python er aktiv nå")
💻 Virtuelle miljøer fikses automatisk
🔒 Pakker installeres og lockes riktig
📀 Cacher av nedlastinger gjør at man slipper å laste ned de samme pakkene igjen og igjen på tvers av prosjekter
😤 Du får mer detaljerte feilmeldinger når avhengigheter krangler
🧰 Kombinerer tilsvarende funksjonalitet som pip + pyenv + venv + pipx + pip-tools i ett verktøy
🧩 Støtte for dev og prod-avhengigheter slik at man slipper tunge produksjonsmiljøer
Det viktigste er egentlig ikke at uv gjør én ting bedre enn noe annet, men at du slipper å kombinere fem verktøy og huske hva de gjør hvor. Det er bare “åpne prosjekt” → “kjør”.
La oss sette det opp
Mac
brew install uv
# eller
curl -LsSf <https://astral.sh/uv/install.sh> | sh
# Legg til i path ved å kjøre
export PATH="$HOME/.local/bin:$PATH"Linux
curl -LsSf <https://astral.sh/uv/install.sh> | sh
# Legg til i path ved å kjøre
export PATH="$HOME/.local/bin:$PATH"Windows
powershell -ExecutionPolicy ByPass -c "irm <https://astral.sh/uv/install.ps1> | iex"
# Legg til path. Her må man inn i system miljøvariabler og kopiere denne inn
%USERPROFILE%\.local\binHvis alt er satt opp riktig vil uv --version her fortelle deg hvilken versjon du har installert.
Hvis du har gamle rester fra andre python installasjoner, er det fullt mulig å avinstallere dem.
Bytte python versjoner
Tidligere har jeg brukt pyenv for å holde styr på Python versjoner, både globalt på pcen og lokalt i prosjekter. uv løser dette helt selv og sørger for å laste ned riktig versjon og bruker den når du ber om det.
For eksempel:
uv init --python 3.12
eller i et eksisterende prosjekt:
uv python install 3.12
uv python pin 3.12
Prosjektet får nå en .python-version, og uv bruker automatisk den versjonen i prosjektet – også på maskiner som ikke har den fra før.
Hverdagsbruk
Lage nytt prosjekt
uv init --python 3.12 Eller en annen Python versjon du ønsker
Dette lager et virtuelt miljø, et lite startscript og to viktige filer: pyproject.toml og uv.lock.

pyproject.toml beskriver hvilke pakker og hvilken Python-versjon prosjektet trenger.
uv.lock lagrer de eksakte versjonene som ble installert, slik at alle får samme miljø uansett maskin.
Når du kommer inn i et eksisterende prosjekt kan du kjøre
uv sync
Og alt som ligger beskrevet i pyproject.toml og uv.lock lastes ned for deg
Når du skal legge til nye pakker i prosjektet kjører du bare
uv add fastapi
Og for å fjerne
uv remove fastapi
Når du skal kjøre et script skriver du
uv run mitt_script.py
🪄 Her gjør uv en del magi i bakgrunnen 🪄
- finner (eller lager) riktig venv
- installerer avhengigheter om de mangler
- henter riktig Python-versjon om den ikke er installert
- kjører koden i det miljøet
Andre fordeler
Hvis du har kommet deg helt hit og synes det høres litt ork ut å bytte, er den gode nyheten at det er veldig enkelt å ta uv i bruk gradvis i eksisterende prosjekter.
uv har støtte for å legge til pakker fra eksisterende filer. Du kan eksempelvis kjøre
uv add --requirements requirements.txt
uv lager da pyproject.toml (om du ikke har det fra før) og henter over avhengighetene dine der.
Hvis du legger til og fjerner pakker med uv kan du enkelt få hentet ut en oppdatert requirements.txt med
uv pip compile
Hvis du er virkelig modig 🦸♀️, eller bare litt utålmodig, finnes det også et innebygd verktøy forsøker å migrere alt av nåværende oppsett til uv
uvx migrate-to-uv
Så bør du bytte?
Det kommer an på hva du jobber med, men hvis du liker enklere oppsett, færre verktøy og mindre tid på dependency-rot, er svaret sannsynligvis ja. Etter å ha gått over selv har jeg ingen planer om å gå tilbake.
Hvis du vil vite mer
uv docs: https://docs.astral.sh/uv
GitHub: https://github.com/astral-sh/uv