Tæm dit Python kaos med venv før det tæmmer dig
Jeg opdagede virtuelt miljø i Python på den hårde måde. Jeg havde et lille script til at omdøbe billedfiler for en ven, og et andet projekt hvor jeg rodede med et webframework. En dag opdaterede jeg en pakke for at få det ene projekt til at virke, og pludselig væltede det andet. Klassisk. Først da jeg satte mig ned og lærte python venv at kende, holdt det op med at ske.
Hvorfor python venv findes i første omgang
Forestil dig, at du har ét køkken til hele opgangen. Alle bruger de samme krydderier, samme køleskab, samme pander. En skifter saltet ud, en anden fylder chili på sukker-glasset. Det er nogenlunde sådan, det føles at installere Python-pakker globalt.
Problemet uden venv:
- Du installerer pakker globalt med
pip install. - Alle dine Python-projekter deler de samme pakker.
- Når du opdaterer en pakke til projekt A, kan projekt B gå i stykker.
- Du aner ikke, hvilke versioner et projekt egentlig brugte, når du vender tilbage 6 måneder senere.
Hvad et virtuelt miljø gør:
- Opretter en lokal kopi af Python og pip inde i dit projekt.
- Gemmer pakkerne i en mappe ved siden af din kode (typisk
venv/). - Holder projekter adskilt, så de ikke skubber til hinandens versioner.
Så når nogen spørger: “Hvad er et virtuelt miljø?”, er den korte, jordnære version: en projekt-specifik Python-installation med egne pakker.
De få begreber du skal kende (uden at drukne i teori)
Jeg tager dem lynhurtigt, så du ved, hvad der foregår, når du ser fejl.
Python interpreter
Det er selve Python-programmet. Det, du kører, når du skriver:
python script.py
I et virtuelt miljø får du en egen interpreter inde i projektet, adskilt fra systemets Python.
pip
pip er Pythons pakkehåndtering. Den henter og installerer pakker som requests, django og så videre.
I et aktivt venv er pip bundet til det miljø, så pakkerne lander det rigtige sted.
site-packages
Det er bare mappen, hvor dine installerede pakker ender. I et venv ligger de i noget ala:
venv/lib/python3.11/site-packages/ # macOS/Linux
venv/Lib/site-packages/ # Windows
Du behøver sjældent at åbne mappen, men det er rart at vide, at den findes.
PATH
PATH er miljøvariablen, der bestemmer, hvilke programmer der bliver fundet, når du skriver python eller pip i terminalen.
Når du aktiverer et venv, bliver PATH ændret, så terminalen bruger Python og pip fra venv-mappen i stedet for systemets.
Opret et Python venv trin for trin
Vi tager et helt nyt projekt. Jeg bruger et eksempel, jeg selv ville lave: et lille script der omdøber filer.
1. Opret en projektmappe
mkdir filrenser
cd filrenser
2. Opret virtuelt miljø
Her bruger du Pythons indbyggede venv-modul.
Fælles for alle systemer:
python -m venv venv
Hvis du har både python og python3 liggende, kan det være, du skal skrive:
python3 -m venv venv
Efter kommandoen har kørt, har du en struktur cirka som:
filrenser/
venv/
bin/ eller Scripts/
Lib/
pyvenv.cfg
Du skal ikke ændre i de filer. Tænk på venv/ som Pythons egen lille maskinrums-mappe.
Aktiver og deaktiver venv (og tjek at du er det rigtige sted)
Der er to ting, jeg altid gør, når jeg arbejder med et projekt:
- Aktiverer det rigtige venv.
- Tjekker at det faktisk er aktivt.
Aktivering på Windows (CMD eller PowerShell)
cd filrenser
venvScriptsactivate
Hvis det virker, vil du typisk se noget i denne stil foran prompten:
(venv) C:stitilfilrenser>
Aktivering på macOS / Linux (Terminal)
cd filrenser
source venv/bin/activate
Her vil du typisk se:
(venv) jonas@computer filrenser %
Tjek at du virkelig er i venv
Jeg stoler aldrig kun på prompten. To hurtige checks:
which python # macOS/Linux
where python # Windows
Du bør få en sti, der peger ind i din venv-mappe.
Og så:
python -m pip list
På et helt nyt venv vil du kun se de helt basale pakker (pip, setuptools og lignende).
Deaktiver venv igen
Her er det simpelt på alle systemer:
deactivate
Prompten mister (venv), og PATH bliver sat tilbage.
Installer pakker i dit venv og gem dem i requirements.txt
Nu er vi der, hvor ting begynder at ligne rigtigt arbejde.
1. Sørg for at venv er aktivt
Hvis du ikke ser (venv) i prompten, så aktiver igen.
2. Installer en pakke
Eksempel: du vil bruge requests til at hente data fra et API.
python -m pip install requests
Bemærk jeg bruger python -m pip i stedet for bare pip. Det mindsker risikoen for at ramme den forkerte pip-version, hvis din PATH driller.
Tjek at pakken er installeret:
python -m pip list
3. Gem dine pakker i requirements.txt
Her laver vi filen, som gør det let at genskabe miljøet senere (eller dele det med andre):
python -m pip freeze > requirements.txt
Nu ligger der en requirements.txt i din projektmappe med alle pakker og deres versioner. Den fil skal normalt med i dit Git repository.
Hvis du er ny i Python, kan du have glæde af at læse mere om filstruktur og basisprojekter i andre artikler på Coding Class senere.
Genskab miljøet på en ny computer
Forestil dig, at du har klonet dit projekt fra GitHub på en ny maskine. Sådan får du det til at køre igen uden gætterier.
1. Opret nyt venv i projektmappen
python -m venv venv
2. Aktivér venv
- Windows:
venvScriptsactivate - macOS/Linux:
source venv/bin/activate
3. Installer alle pakker fra requirements.txt
python -m pip install -r requirements.txt
Nu har du samme pakke-setup, som da du sidst gemte filen. Ikke noget med “jeg tror, det var version 1.2 eller 1.3”.
Typiske fejl med python venv (og hvad jeg plejer at gøre)
Her er de fejl, jeg selv møder oftest, enten hos mig selv eller hos andre, der lige er begyndt.
“pip not found” eller “command not found: pip”
Typiske årsager:
- Venv er ikke aktivt.
- Du har ikke Python korrekt i PATH.
- Du bruger systemets pip i stedet for venvs.
Mit standardforsøg:
python -m pip --version
Hvis det virker, så brug python -m pip fremover.
Forkert Python-version i projektet
Måske har du installeret Python 3.12, men projektet blev lavet med 3.10, og en eller anden pakke understøtter ikke den nye endnu.
Tjek hvilken version dit venv bruger:
python --version
Hvis du skal bruge en specifik version, så opret venv med den direkte:
python3.10 -m venv venv
“Permission denied” når du installerer pakker
Hvis du ser fejl, der nævner “permission” eller beder om sudo, er du sandsynligvis ikke i et venv og prøver at skrive i systemets Python-mapper.
Løsning:
- Tjek at venv er aktivt.
- Brug
python -m pip install ...inde i venv. - Undgå
sudo pip installtil projekter, du selv styrer.
“Module not found” selv om du lige har installeret pakken
Du har kørt pip install noget, men når du kører scriptet, får du:
ModuleNotFoundError: No module named 'noget'
Jeg plejer at tjekke to ting:
- Kører jeg scriptet med samme Python, som hører til mit venv?
- Installerede jeg pakken i det venv, eller globalt?
Brug de her to linjer:
which python # eller where python på Windows
python -m pip list
De skal begge pege ind i venv og vise pakken på listen.
Hvornår er python venv nok, og hvornår skal du kigge på Poetry eller uv?
Til langt de fleste små projekter er python venv + requirements.txt rigeligt. Jeg bruger det selv til:
- Små scripts til filhåndtering.
- Eksperimenter med
pandasellermatplotlib. - Små webprojekter med f.eks. Flask.
Men der er situationer, hvor værktøjer som Poetry eller nyere ting som uv begynder at give mening:
Overvej Poetry, hvis:
- Du laver et bibliotek, der skal udgives på PyPI.
- Du vil have automatisk håndtering af
pyproject.toml, versionsnummer, builds osv. - Du vil have én kommandocentral til alt: venv, pakker, scripts.
Overvej uv, hvis:
- Du vil have meget hurtigere pakkeinstallation.
- Du arbejder med større projekter med mange afhængigheder.
- Du er klar på et lidt nyere værktøj og kan leve med, at dokumentation og eksempler stadig udvikler sig.
Hvis du lige er startet med Python, vil jeg klart anbefale at lære det klassiske venv-flow først. Det er også den base, som andre værktøjer bygger ovenpå. Når du er tryg ved python -m venv, aktivering, pip install og requirements.txt, giver det mere mening at kigge videre.
Hvis du vil videre fra her, kan du for eksempel kombinere venv med Git og kigge på versionsstyring. Der har vi også materiale på Coding Class, som viser, hvordan du strukturerer et helt lille Python-projekt fra start til slut.









1 kommentar