← Python/Modules en tooling
Les 5 van 8
MODULE 09 · 05◷ 35 min

Een eigen Pythonomgeving gebruiken

Na deze les kun je
  • Een virtuele omgeving met de bestaande Python maken.
  • De interpreter van die omgeving expliciet kiezen.
  • Argumenten doorgeven en pakketomgevingen gescheiden houden.

Twee projecten kunnen verschillende pakketten nodig hebben. Als alles in één gedeelde Pythoninstallatie belandt, kan een aanpassing voor het ene project het andere raken. Geef ieder project daarom een eigen plek voor zijn geïnstalleerde pakketten.

Een omgeving naast je broncode

Een virtuele omgeving is een map met een eigen ingang naar Python en een eigen pakketmap. De bestaande basisinterpreter levert de Pythonversie. Een omgeving maken verandert dus niet vanzelf Python 3.14 in Python 3.15.

De projectbeschrijving uit de vorige les zegt wat nodig is. De omgeving is de plek waar je het kunt gebruiken. Je eigen broncode blijft buiten die omgevingsmap; bewaar de beschrijving in Git en maak de omgeving opnieuw wanneer dat nodig is.

Deze oefening voert echte commando’s uit in een tijdelijke Linuxomgeving. Je bewerkt bestanden met de extensie .sh: een shell leest hun commandoregels. De meegeleverde Pythoncontrole voert die bestanden voor je uit; je hoeft geen terminal op je eigen computer te openen.

Maken en gebruiken zijn twee handelingen

python3 -m venv --without-pip .demo
.demo/bin/python inspect_env.py

De eerste regel start de standaardmodule venv en maakt .demo. Met --without-pip slaan we de installatie van pip over; deze oefening heeft geen downloads nodig. Het tweede commando start expliciet Python vanuit de nieuwe omgeving.

Op Linux staat die ingang onder bin/python; op Windows is dat doorgaans Scripts/python.exe. De bestandsnamen in deze opdrachten horen bij de Linux-oefenomgeving. Op je eigen computer kies je later het pad dat bij jouw systeem past.

Het eerste voorbeeld maakt een andere omgeving dan de opdracht. De meegeleverde hulpcode geeft de werkelijk ontvangen uitvoer door. Let op de combinatie van de omgevingstest en het versienummer.

De omgeving en haar basis delen een versie maar hebben een andere prefix
demo.sh
python3 -m venv --without-pip .demo
.demo/bin/python inspect_env.py
inspect_env.py
import sys

print(sys.prefix != sys.base_prefix)
print(".".join(map(str, sys.version_info[:3])))
run_example.py
import subprocess

completed = subprocess.run(["sh", "demo.sh"], capture_output=True, text=True, timeout=2)
print(completed.stdout, end="")
print(completed.stderr, end="", file=__import__("sys").stderr)
raise SystemExit(completed.returncode)
Verwachte uitvoer
True
3.14.2

Herkennen welke Python draait

Python geeft zijn omgeving weer via sys.prefix en zijn basis via sys.base_prefix. Zijn die verschillend, dan draait deze interpreter in een virtuele omgeving. Alleen kijken naar het Pythonversienummer vertelt dat niet: twee omgevingen kunnen dezelfde versie hebben.

Activeren past onder meer het zoekpad van je shell aan, zodat een kort commando zoals python de gewenste interpreter kan vinden. Het is optioneel wanneer je het interpreterpad expliciet opgeeft. Een aangepaste prompt of de variabele VIRTUAL_ENV alleen bewijst niet welke interpreter je werkelijk gestart hebt.

Argumenten heel doorgeven

Een commandobestand kan argumenten ontvangen. In een shell staat "$@" voor alle ontvangen argumenten, met behoud van hun afzonderlijke grenzen. Zo blijft de naam "lange wandeling" één argument in plaats van twee losse woorden.

.demo/bin/python report.py "$@"

Het meegeleverde rapport gebruikt argparse, dat je al kent. Het drukt een aantal, een naam en de naam van zijn Pythonomgeving af. Jij schrijft alleen het startcommando en laat de ontvangen argumenten doorgeven.

Veelgemaakte fout: alleen de map maken

Het tweede voorbeeld maakt wel een omgeving, maar start daarna de basisinterpreter. De omgevingstest is daardoor False. Het versienummer blijft gelijk, waardoor je deze fout met alleen een versiecontrole zou missen.

Een gemaakte omgeving kiest niet vanzelf de interpreter van het volgende commando
demo.sh
python3 -m venv --without-pip .demo
python3 inspect_env.py
inspect_env.py
import sys

print(sys.prefix != sys.base_prefix)
print(".".join(map(str, sys.version_info[:3])))
run_example.py
import subprocess

completed = subprocess.run(["sh", "demo.sh"], capture_output=True, text=True, timeout=2)
print(completed.stdout, end="")
print(completed.stderr, end="", file=__import__("sys").stderr)
raise SystemExit(completed.returncode)
Verwachte uitvoer
False
3.14.2

Een tweede project krijgt een verse omgeving, geen gekopieerde eerste omgeving. De controle plaatst een kleine proefmodule uitsluitend in de eerste pakketmap. De tweede omgeving en de basisinterpreter horen die module niet te kunnen importeren.

AAN DE SLAG 0/4
1

Een echte virtuele omgeving maken

Zet in create.sh de regel python3 -m venv --without-pip .venv. Maak een echte omgeving op basis van de beschikbare Python 3.14.2, zonder toegang tot de systeem-site-packages. Een lege map of alleen een succesmelding is onvoldoende.

2

De omgeving via haar eigen Python bekijken

Start in inspect.sh het meegeleverde inspect_env.py met .venv/bin/python. De controle voert create.sh eerst uit. De ontvangen gegevens moeten de echte .venv als prefix, een andere basisprefix en Python 3.14.2 tonen; verzin geen JSON-uitvoer.

3

Een programma met zijn argumenten starten

Start in report.sh het meegeleverde report.py met .venv/bin/python en geef alle ontvangen argumenten door met "$@". Ook een naam met spaties moet één argument blijven. create.sh wordt eerst uitgevoerd; het rapport moet de omgeving .venv noemen.

4

Een tweede onafhankelijke omgeving maken

Maak in second.sh met de basisinterpreter een verse omgeving .other, eveneens zonder pip en zonder systeem-site-packages. Kopieer .venv niet. Een proefmodule die alleen in .venv is geplaatst, moet daar werken en in .other en de basisinterpreter een echte ModuleNotFoundError geven.

Onthoud dit

  • Maak een omgeving met een gekozen basisinterpreter.
  • Start de juiste Python expliciet of activeer bewust je shell.
  • Houd de pakketten van verschillende projecten gescheiden.

Hierna gebruik je uv om projectafspraken vast te leggen en een omgeving te synchroniseren.

create.sh

Deze les gebruikt Python-tools. Log in om de opdrachten uit te voeren →

UitvoerPython
›
›_

Hier komt je resultaat.

Voer je code uit en ontdek
wat je hebt gemaakt.

0/4 stappen
EVEN MEEKIJKEN

Bekijk hoe het kan.

Je mag de oplossing bekijken. Deze poging telt dan niet mee als afgeronde les. Met Reset kun je daarna opnieuw zelf oefenen.