← Terug naar tutorials

Python venv activeert niet? 5 fixes die echt werken (backend)

pythonvenvvirtualenvbackendpowershellbashzshwindowslinuxmacostroubleshooting

Python venv activeert niet? 5 fixes die echt werken (backend)

Een Python virtual environment (venv) hoort “gewoon” te activeren, maar in de praktijk gaat het vaak mis: je prompt verandert niet, python blijft naar je systeeminstallatie wijzen, pip installeert in de verkeerde site-packages, of je krijgt permissie- en policy-errors. In backend-projecten is dit extra pijnlijk: je draait een API, Celery worker, migrations, tests, en ineens blijken dependencies “verdwenen” of in conflict.

In deze tutorial krijg je 5 fixes die echt werken, inclusief diepe uitleg over wat er onder de motorkap gebeurt, en concrete commando’s voor Windows, macOS en Linux. Je leert ook hoe je verifieert dat je venv écht actief is, en hoe je voorkomt dat het opnieuw misgaat.


Inhoud

  1. Wat “activatie” eigenlijk doet (en wat niet)
  2. Symptomen: hoe herken je dat je venv niet actief is?
  3. Fix 1 — Gebruik het juiste activatie-script (per shell/OS)
  4. Fix 2 — Omzeil activatie: gebruik altijd het venv-pad naar python/pip
  5. Fix 3 — Windows Execution Policy / scripts geblokkeerd
  6. Fix 4 — Verkeerde Python/venv door PATH, aliases, pyenv, conda of IDE
  7. Fix 5 — Venv is corrupt of verkeerd aangemaakt: rebuild correct
  8. Checklist: venv correct? (snelle verificatie)
  9. Backend best practices om venv-problemen te voorkomen

Wat “activatie” eigenlijk doet (en wat niet)

Een venv is in essentie een mapstructuur met:

Activatie is géén magische modus in Python. Het is simpelweg een shell-script dat:

  1. Je PATH aanpast zodat python en pip eerst uit de venv komen.
  2. Variabelen zet zoals VIRTUAL_ENV.
  3. Soms je prompt aanpast (bijv. (venv)).

Daarom kunnen dingen misgaan als:

Belangrijk: je kunt altijd zonder activatie werken door direct het venv-pad te gebruiken (zie Fix 2). Activatie is vooral gemak.


Symptomen: hoe herken je dat je venv niet actief is?

Typische signalen:

Snelle diagnose-commando’s

macOS/Linux:

which python
which pip
python -c "import sys; print(sys.executable); print(sys.prefix)"
python -m pip -V
echo $VIRTUAL_ENV

Windows (PowerShell):

where python
where pip
python -c "import sys; print(sys.executable); print(sys.prefix)"
python -m pip -V
echo $env:VIRTUAL_ENV

Interpretatie:


Fix 1 — Gebruik het juiste activatie-script (per shell/OS)

De meest voorkomende oorzaak: je gebruikt het verkeerde commando voor jouw shell. Er zijn meerdere scripts omdat Bash, Zsh, Fish, PowerShell en cmd andere syntaxis hebben.

1.1 Maak een venv aan (als je die nog niet hebt)

Ga naar je projectmap:

cd /pad/naar/jouw/backend-project

Maak venv (aanbevolen naam: .venv):

python -m venv .venv

Als python niet de juiste versie is, gebruik dan expliciet python3:

python3 -m venv .venv

Backend tip: .venv in de projectroot is handig voor IDE-detectie en tooling.

1.2 Activeer correct per platform

macOS/Linux (Bash/Zsh)

source .venv/bin/activate

Als je “permission denied” krijgt, is dat meestal niet het activatie-script zelf, maar je shell of filesystem. Check dan Fix 5 (rebuild) of Fix 4 (shell/alias).

Fish shell

source .venv/bin/activate.fish

Windows — PowerShell

.\.venv\Scripts\Activate.ps1

Windows — Command Prompt (cmd.exe)

.\.venv\Scripts\activate.bat

1.3 Veelgemaakte fouten

Controleer je huidige map:

macOS/Linux

pwd
ls -la

Windows

Get-Location
dir

Fix 2 — Omzeil activatie: gebruik altijd het venv-pad naar python/pip

Soms wil je activatie vermijden (bijv. in CI, Docker, Makefiles, scripts, of als policies roet in het eten gooien). Dit is ook de meest “waterdichte” methode: je gebruikt direct de interpreter uit de venv.

2.1 Gebruik python -m pip (belangrijk)

Gebruik bij voorkeur:

python -m pip install -r requirements.txt

Waarom? Omdat pip als los commando soms naar een andere Python wijst. python -m pip garandeert: pip draait binnen déze Python.

2.2 Directe paden

macOS/Linux:

./.venv/bin/python -m pip install -r requirements.txt
./.venv/bin/python -m pytest
./.venv/bin/python -m uvicorn app.main:app --reload

Windows (PowerShell):

.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe -m pytest
.\.venv\Scripts\python.exe -m uvicorn app.main:app --reload

2.3 Waarom dit werkt (dieper)

Activatie wijzigt alleen je shell-omgeving (PATH). Als je per ongeluk een subshell, een task runner, of een IDE-run-config gebruikt die niet dezelfde omgeving erft, kan je activatie “verdwijnen”. Door het pad naar python te hardcoden, omzeil je PATH volledig.

Voor backend tooling is dit ideaal in:

Voorbeeld Makefile:

PY=./.venv/bin/python

install:
	$(PY) -m pip install -r requirements.txt

run:
	$(PY) -m uvicorn app.main:app --reload

Fix 3 — Windows Execution Policy / scripts geblokkeerd

Op Windows is dit dé klassieker: PowerShell blokkeert scripts, waardoor Activate.ps1 niet mag draaien.

3.1 Symptoom

Je ziet iets als:

3.2 Oplossing: policy aanpassen (veilig en gericht)

Open PowerShell als jouw gebruiker (meestal géén admin nodig) en zet policy voor CurrentUser:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Controleer:

Get-ExecutionPolicy -List

Daarna activeer opnieuw:

.\.venv\Scripts\Activate.ps1

Wat betekent RemoteSigned?

3.3 Alternatief: unblock het activatie-script

Als je venv-map is gekopieerd of gedownload, kan Windows het markeren als “from the internet”. Dan kun je unblocken:

Unblock-File .\.venv\Scripts\Activate.ps1

3.4 Alternatief: gebruik cmd activatie of Fix 2

Als je policy niet mag aanpassen (bedrijfslaptop):


Fix 4 — Verkeerde Python/venv door PATH, aliases, pyenv, conda of IDE

Soms “activeer” je correct, maar toch blijft python naar iets anders wijzen. Dit komt door:

4.1 Check wat je shell écht uitvoert

macOS/Linux:

type -a python
type -a pip
which -a python

Windows PowerShell:

Get-Command python
Get-Command pip

Als je na activatie nog steeds een pad ziet buiten .venv, dan overschrijft iets je PATH-resolutie.

4.2 Conda “base” auto-activatie uitzetten (indien relevant)

Als je conda gebruikt en je ziet steeds (base):

conda config --set auto_activate_base false

Herstart je terminal.

4.3 pyenv: zorg dat je venv met de juiste Python is gemaakt

Als je pyenv gebruikt, kies eerst je Python:

pyenv versions
pyenv local 3.12.2
python -V
python -m venv .venv

Belangrijk: een venv “onthoudt” de base interpreter via pyvenv.cfg. Als je later van Python wisselt, kan de venv inconsistent worden (zie Fix 5).

4.4 VS Code: interpreter expliciet kiezen

In VS Code kan je terminal wél geactiveerd zijn, maar de Run/Debug gebruikt een andere interpreter.

Controleer in VS Code terminal:

python -c "import sys; print(sys.executable)"

En in je app-run (bijv. debug console) idem.

4.5 pip vs python -m pip (nogmaals, omdat dit vaak de echte bug is)

Als pip install “werkt” maar je app vindt het package niet, dan installeer je waarschijnlijk in een andere Python.

Gebruik altijd:

python -m pip install <package>
python -m pip -V

En check dat pip -V hetzelfde prefix toont als sys.executable.


Fix 5 — Venv is corrupt of verkeerd aangemaakt: rebuild correct

Soms is de venv simpelweg niet gezond meer. Oorzaken:

De snelste betrouwbare oplossing: verwijder en maak opnieuw.

5.1 Verwijder de venv

macOS/Linux:

rm -rf .venv

Windows (PowerShell):

Remove-Item -Recurse -Force .\.venv

5.2 Maak opnieuw aan met de juiste Python

Controleer eerst je Python:

python -V
python -c "import sys; print(sys.executable)"

Maak venv:

python -m venv .venv

Activeer (optioneel):

source .venv/bin/activate
# of op Windows:
# .\.venv\Scripts\Activate.ps1

5.3 Upgrade pip/setuptools/wheel (aanbevolen)

Binnen de venv:

python -m pip install --upgrade pip setuptools wheel

5.4 Installeer dependencies opnieuw

Als je requirements.txt gebruikt:

python -m pip install -r requirements.txt

Als je pyproject.toml gebruikt (bijv. met Poetry of uv), gebruik de bijbehorende tool. Voor een “pure pip” aanpak met PEP 517 builds:

python -m pip install .

Of editable (handig voor backend development):

python -m pip install -e .

5.5 Waarom rebuild vaak beter is dan debuggen

Een venv is goedkoop om opnieuw te maken. Debuggen van half-broken symlinks of oude compiled wheels kost vaak meer tijd dan:

  1. venv weggooien
  2. opnieuw aanmaken
  3. dependencies opnieuw installeren

Voor backend teams is dit ook het meest reproduceerbaar.


Checklist: venv correct? (snelle verificatie)

Gebruik deze checklist nadat je denkt dat alles werkt.

1) Staat VIRTUAL_ENV goed?

macOS/Linux:

echo $VIRTUAL_ENV

Windows:

echo $env:VIRTUAL_ENV

Moet wijzen naar jouw .venv pad.

2) Wijst python naar .venv?

macOS/Linux:

which python
python -c "import sys; print(sys.executable)"

Windows:

where python
python -c "import sys; print(sys.executable)"

3) Wijst pip naar dezelfde omgeving?

python -m pip -V

Je ziet iets als:

4) Test een import die je nodig hebt (backend)

Bijv. FastAPI:

python -c "import fastapi; import uvicorn; print('ok')"

Of Django:

python -c "import django; print(django.get_version())"

5) Draai je server met de venv-python

FastAPI/uvicorn:

python -m uvicorn app.main:app --reload --port 8000

Django:

python manage.py runserver

Backend best practices om venv-problemen te voorkomen

1) Gebruik altijd .venv in de projectroot

Veel tools herkennen dit automatisch (VS Code, pyright, ruff, etc.). Dit vermindert “verkeerde interpreter” problemen.

Aanbevolen structuur:

backend-project/
  app/
  tests/
  pyproject.toml of requirements.txt
  .venv/

2) Gebruik python -m pip als standaard

Maak er een gewoonte van. Het voorkomt 80% van “pip installeert verkeerd” issues.

Slecht:

pip install -r requirements.txt

Goed:

python -m pip install -r requirements.txt

3) Pin je dependencies en Python-versie

Voorbeeld in README:

python -V  # verwacht 3.12.x

4) Automatiseer setup

Een Makefile of justfile voorkomt dat iedereen andere commando’s gebruikt.

Voorbeeld Makefile (cross-platform is lastiger, maar op Unix prima):

VENV=.venv
PY=$(VENV)/bin/python

venv:
	python3 -m venv $(VENV)
	$(PY) -m pip install --upgrade pip setuptools wheel

install:
	$(PY) -m pip install -r requirements.txt

run:
	$(PY) -m uvicorn app.main:app --reload

5) Gebruik in CI altijd expliciete paden (Fix 2)

In CI wil je geen afhankelijkheid van shell-activatie. Gebruik:

python -m venv .venv
./.venv/bin/python -m pip install -r requirements.txt
./.venv/bin/python -m pytest

Samenvatting: de 5 fixes in één oogopslag

  1. Juiste activatie-script per shell/OS

    • source .venv/bin/activate (Bash/Zsh)
    • .\.venv\Scripts\Activate.ps1 (PowerShell)
  2. Omzeil activatie en gebruik direct ./.venv/bin/python of .\.venv\Scripts\python.exe + -m pip.

  3. Windows Execution Policy fixen met Set-ExecutionPolicy RemoteSigned -Scope CurrentUser of Unblock-File.

  4. PATH/alias/conda/pyenv/IDE conflicts opsporen met type -a python, Get-Command python, en interpreter expliciet kiezen.

  5. Rebuild venv als hij corrupt/verplaatst/verouderd is: .venv verwijderen, opnieuw python -m venv .venv, dependencies opnieuw installeren.


Als je jouw OS + shell (bijv. “Windows 11 PowerShell”, “macOS zsh”, “Ubuntu bash”) en de exacte foutmelding plakt, kan ik de juiste fix aanwijzen en je commando’s exact op jouw situatie afstemmen.