Beetje Coderen

Les 2

Python-omgeving: venv en pip

Een eigen werkomgeving per project met venv en pakketten installeren met pip.

⏱ 45–60 minuten leestijd + oefenen

🎯 Na deze les kun je

  • een virtuele omgeving maken en activeren
  • pakketten installeren en vastleggen in requirements.txt
  • uitleggen waarom je per project een venv gebruikt

Je schrijft een script dat requests gebruikt (les 25), en het werkt. Een halfjaar later begin je een ander project dat een nieuwere versie van requests nodig heeft. Je installeert die, en nu werkt je oude script niet meer. Of je stuurt je project naar een collega, en die krijgt meteen ModuleNotFoundError. De oplossing is een virtuele omgeving (venv) per project: een eigen map met een eigen Python en eigen pakketten, los van de rest van je computer. In deze les leer je die maken, pakketten installeren met pip en vastleggen wat je project nodig heeft.

Welke Python draai je eigenlijk?

Op één computer staan vaak meerdere Python-versies. Controleer welke je gebruikt:

python3 --version
Python 3.13.5

Op Windows heet het commando meestal py of python; op Linux en macOS python3. In deze cursus schrijven we python3; gebruik wat bij jou werkt.

Een gewoonte die veel problemen voorkomt: start hulpprogramma's die bij Python horen via python3 -m:

python3 -m venv .venv
python3 -m pip install requests

-m betekent: voer deze module uit met deze Python. Zo weet je zeker dat pip pakketten installeert voor dezelfde Python die je straks gebruikt. Los pip kan bij een andere Python horen.

Een venv maken en activeren

In de map van je project:

python3 -m venv .venv

Dit maakt een map .venv met een kopie van (of link naar) Python en een eigen, lege map voor pakketten. .venv is de gebruikelijke naam; editors als VS Code herkennen hem automatisch.

Activeren:

Systeem Commando
Linux, macOS source .venv/bin/activate
Windows (PowerShell) .venv\Scripts\Activate.ps1
Windows (cmd) .venv\Scripts\activate.bat

Je prompt krijgt (.venv) ervoor. Controleer welke Python nu actief is:

which python
/home/student/project/.venv/bin/python

(Op Windows: where python.) Binnen een actieve venv mag je gewoon python en pip typen; die wijzen naar de venv. Terug naar normaal met deactivate.

Activeren is eigenlijk alleen een gemak: het zet .venv/bin vooraan in je PATH. Je kunt ook direct .venv/bin/python script.py uitvoeren, zonder te activeren. Dat is handig in scripts en cron.

Pakketten installeren met pip

pip install requests
pip install "requests==2.32.3"     # precies deze versie
pip install --upgrade requests     # bijwerken
pip uninstall requests
pip list                           # wat is er geïnstalleerd?

pip haalt pakketten van PyPI (Python Package Index), installeert ze en ook alles waar ze zelf van afhangen. Bij requests komen zo ook urllib3, idna, certifi en charset-normalizer mee.

Vastleggen: requirements.txt

Om je project ergens anders opnieuw op te zetten, leg je vast welke pakketten het nodig heeft:

pip freeze > requirements.txt
certifi==2025.8.3
charset-normalizer==3.4.3
idna==3.10
requests==2.32.5
urllib3==2.5.0

(Je versienummers kunnen anders zijn.) pip freeze zet alles in de venv vast, met exacte versies. Iemand anders (of jij op een nieuwe laptop) doet dan:

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

en heeft precies dezelfde versies.

Twee afspraken:

  • .venv gaat niet in git. Zet het in .gitignore. Een venv is gebonden aan de computer en het pad waar hij gemaakt is; je maakt hem altijd opnieuw uit requirements.txt.
  • requirements.txt gaat wel in git.

Je kunt requirements.txt ook met de hand schrijven, met alleen de pakketten die je zelf gebruikt (requests>=2.31). Dat is overzichtelijker, maar minder exact. In les 32 zie je pyproject.toml, waarin moderne projecten hun afhankelijkheden vastleggen.

De typische fout: het pakket staat in de verkeerde omgeving

pip install requests
python3 mijnscript.py
Traceback (most recent call last):
  File "/home/student/project/mijnscript.py", line 1, in <module>
    import requests
ModuleNotFoundError: No module named 'requests'

Maar je hebt het net geïnstalleerd! Bijna altijd betekent dit: pip en python3 horen bij verschillende omgevingen. Bijvoorbeeld: je venv was niet actief toen je installeerde, of je editor gebruikt een andere Python dan je terminal.

Zo zoek je het uit:

which python3
python3 -m pip --version

Beide paden moeten in dezelfde .venv wijzen. Vanuit Python zelf:

import sys
print(sys.executable)

Die regel print het pad van de Python die het script echt uitvoert. Kies in je editor dezelfde interpreter (in VS Code: Python: Select Interpreter).

Op recente Linux-distributies krijg je bij pip install buiten een venv de melding error: externally-managed-environment. Dat is bewust: de systeem-Python is van de distributie, en pakketten die je daar installeert kunnen systeemtools breken. Het antwoord is niet --break-system-packages, maar: maak een venv.

Oefenen

Oefening 1. Maak een map weerapp, maak er een venv in, activeer hem, installeer requests en leg de afhankelijkheden vast. Schrijf de commando's op.

Modelantwoord oefening 1
mkdir weerapp
cd weerapp
python3 -m venv .venv
source .venv/bin/activate
pip install requests
pip freeze > requirements.txt

Oefening 2. Een collega stuurt je een zip met app.py, requirements.txt en een map .venv. Wat doe je met die map, en hoe zet je het project op?

Modelantwoord oefening 2

De meegestuurde .venv gooi je weg; die hoort bij de computer van je collega en werkt bij jou meestal niet. Daarna:

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

Vraag je collega om .venv voortaan in .gitignore te zetten.

Oefening 3. Je krijgt ModuleNotFoundError: No module named 'requests', terwijl pip list het pakket toont. Noem twee manieren om te controleren welke Python je script uitvoert.

Modelantwoord oefening 3
  • In de terminal which python3 (of where python op Windows) en python3 -m pip --version vergelijken.
  • In het script import sys; print(sys.executable) zetten.

Kijk ook welke interpreter je editor gebruikt.

Lab: een project opzetten met venv en requirements.txt

  1. In de map weerapp van het lab staat app.py, dat requests en rich gebruikt.
  2. Maak een venv in weerapp/.venv en installeer de twee pakketten.
  3. Leg de afhankelijkheden vast in weerapp/requirements.txt.
  4. Maak een .gitignore waarin .venv/ staat.
  5. Controleer met beetje check python-les2. De check maakt een nieuwe venv, installeert jouw requirements.txt en draait app.py.

Samenvatting

  • Gebruik per project een eigen venv: python3 -m venv .venv, en activeer hem.
  • Start tools via python3 -m zodat ze bij de juiste Python horen.
  • pip install, pip list, pip freeze > requirements.txt en pip install -r requirements.txt.
  • .venv niet in git, requirements.txt wel.
  • ModuleNotFoundError na een installatie betekent bijna altijd: een andere Python dan je denkt. Controleer met sys.executable.

In les 3 duik je dieper in strings: opmaak, methodes en encodings.

Lab

Project opzetten met venv en requirements.txt

💻 Dit lab doe je op je eigen computer met Docker. Start de lab-container met (geeft de opdracht een eigen startcommando, gebruik dan dat):

$ docker run -it --rm registry.wizg.it/webhosting/beetje-labs:python-les2

Volg daarna de stappen van de opdracht hierboven. Nog geen Docker? Zie les 14 van Een beetje Linux & Docker. Voor dit lab is er geen live lab in de browser.

Klaar? Controleer je werk met:

$ beetje check python-les2

📝 Quiz: venv en pip

5 vragen · 70% nodig om te slagen

1. Waarom gebruik je per project een virtuele omgeving?
2. Waarom schrijf je `python3 -m pip install` in plaats van alleen `pip install`?
3. Wat zet je in git?
4. Welk commando legt alle geïnstalleerde pakketten met exacte versies vast?
5. Je krijgt ModuleNotFoundError terwijl je het pakket net installeerde. Wat is de meest waarschijnlijke oorzaak?