Zo kun je programmeren in Python - Deel 9
Je kunt nu al goed overweg met allerlei aspecten van Python, maar naast de standaardbibliotheek van Python bestaan er nog heel wat extra modules. In deze les leer je hoe je deze installeert en hoe je met virtuele omgevingen werkt om met conflicterende vereisten van modules om te gaan.
Basisfunctionaliteit die bijna iedereen nodig heeft, zit in de standaardbibliotheek van Python. In les 6 zag je al hoe je toegang tot deze functionaliteit krijgt met de opdracht import en toonden we je kort enkele standaardmodules. Maar in die les schreef je ook je eigen module. Deze les gaat volledig over het installeren van extra modules die anderen geschreven hebben.
Pakketten vinden op PyPI
Iedereen kan zelf een Python-module maken, zoals je in les 6 zelf ook hebt gedaan. Python biedt een centrale repository aan met modules die je eenvoudig kunt installeren en in je eigen Python-programma’s kunt gebruiken: de Python Package Index of afgekort PyPI. Je vindt ze op de website www.pypi.org.
PyPI bevat meer dan 170.000 projecten, die pakketten worden genoemd. Een pakket bevat één of meerdere Python-modules. Je zoekt op de website van PyPI op trefwoorden om pakketten te vinden die je in je code kunt gebruiken. Maar het kan nog eenvoudiger op de opdrachtregel van je besturingssysteem met het programma pip3, dat deel uitmaakt van Python. Zo zoek je met de volgende opdracht naar pakketten:
pip3 search <zoekterm>
Je krijgt dan een lijst te zien met pakketnamen en een korte beschrijving van één regel waarin je zoekterm voorkomt. Wil je meer informatie over het pakket lezen, dan zul je de pagina voor het pakket op de website van PyPI moeten raadplegen, waar een uitgebreidere beschrijving staat, inclusief een link naar de website van het pakket.
Een pakket installeren met pip3
Heb je eenmaal een pakket gevonden dat je wilt gebruiken, dan installeer je het ook eenvoudig met pip3:
pip3 install urllib3
Na de installatie van een pakket kun je meer informatie over het pakket opvragen met:
pip3 show urllib3
Naast de korte beschrijving en het versienummer van het geïnstalleerde pakket, krijg je ook de website en de licentie te zien.
Geïnstalleerde module in je Python-code gebruiken
Nadat je een pakket geïnstalleerd hebt met pip3, kun je de modules erin gebruiken, net zoals de standaardmodules van Python. Voor het voorbeeld van urllib3:
>>> import urllib3
>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://reshift.nl/robots.txt')
>>> r.status
200
>>> r.data
b'User-agent: *\nDisallow: /wp-admin/\nAllow: /wp-admin/admin-ajax.php\n'
Na de installatie van een pakket maakt het dus niet meer uit of de module in de standaardbibliotheek zit of niet. Voordat je een module in je eigen code gebruikt, dien je wel na te kijken wat de licentie van het project je toelaat. Maar omdat de meeste Python-pakketten een opensource-licentie gebruiken, zal het gebruik niet snel problematisch zijn.
Het nut van virtuele omgevingen
Als je veel Python-pakketten installeert met pip3, kom je wellicht een keer in de problemen. Pakketten importeren immers ook andere pakketten die ze gebruiken, die noemen we ‘afhankelijkheden’. Maar misschien installeert pakket A versie 1.0 van pakket Z en installeert pakket B de met versie 1.0 incompatibele versie 2.0 van pakket Z. Het gevolg? Na de installatie van pakket B werkt pakket A niet meer, want je kunt maar één versie van een Python-pakket installeren.
Gelukkig heeft Python voor deze problemen een oplossing: virtuele omgevingen. Een virtuele omgeving is een directory op je computer waarin je Python-pakketten installeert in de plaats van in je globale Python-pakketdirectory. Deze virtuele omgeving is volledig gescheiden van andere virtuele omgevingen en van de globale Python-pakketdirectory. Als je dan voor elk Python-project dat je wilt installeren of ontwikkelen een nieuwe virtuele omgeving aanmaakt, ben je zeker dat je door de installatie van de pakketten die je nodig hebt geen van je andere projecten doet falen.
Virtuele omgeving opzetten met venv
Een virtuele omgeving opzetten, doe je in Python met de module venv:
python3 -m venv C:\pad\naar\mijnomgeving
Dit maakt de opgegeven directory (en eventuele bovenliggende directory’s die nog niet bestaan) en maakt verwijzingen naar de Python-interpreter en een lege directory voor pakketten.
Om nu de virtuele omgeving te gebruiken, moet je ze eerst ‘activeren’. Dat doe je als volgt:
C:\pad\naar\mijnomgeving\Scripts\activate.bat
Als je nu met pip3 pakketten installeert, worden ze in de virtuele omgeving geïnstalleerd en niet in je globale Python-pakketbibliotheek. De virtuele omgeving verlaten doe je met de opdracht deactivate. Je werkt dan weer in je globale Python-omgeving. Je kunt nu een andere virtuele omgeving opzetten of een virtuele omgeving die je al hebt aangemaakt activeren. Zo schakel je eenvoudig tussen verschillende projecten over zonder dat de installatie van Python-pakketten in de ene omgeving een impact heeft op een andere omgeving.
Virtuele omgeving in macOS en Linux
De Python-module venv werkt net iets anders in andere besturingssystemen. De directory Scripts heet in macOS en Linux bin, en Lib (met hoofdletter L) heet lib (helemaal in kleine letters). Bovendien activeer je de virtuele omgeving niet met een batchbestand zoals in Windows, maar met een shellscript, dat geen extensie .bat heeft, en dat activeren doe je met de opdracht source. De virtuele omgeving van een omgeving activeren doe je onder macOS en Linux dus met de opdracht: source mijnomgeving/bin/activate.
Afhankelijkheden opslaan en opnieuw installeren
Als je project veel afhankelijkheden gebruikt en je die allemaal in een virtuele omgeving hebt geïnstalleerd met pip3, wil je natuurlijk dat iemand anders die je code draait zo eenvoudig mogelijk al die pakketten kan installeren. Gelukkig kun je eenvoudig een lijst aanmaken met alle in de virtuele omgeving geïnstalleerde pakketten en hun versies:
pip3 freeze > requirements.txt
Het bestand requirements.txt bevat dan voor elk geïnstalleerd pakket in de virtuele omgeving een regel:
pakketnaam==versienummer
Daarna kan de andere gebruiker op zijn computer een virtuele omgeving aanmaken en je Python-code daarin kopiëren. Die code zal nog niet werken, want de afhankelijkheden zijn nog niet geïnstalleerd. Maar als je het bestand requirements.txt samen met je code verspreidt, hoeft de gebruiker maar één opdracht uit te voeren in de virtuele omgeving om alle afhankelijkheden te installeren:
pip3 install -r requirements.txt
Daarna ben je zeker dat jouw code ook op de andere computers werkt, tenminste als ook jullie Python-versies hetzelfde zijn. De afhankelijkheden zijn immers hetzelfde en van dezelfde versies.
Als je de versienummers van je afhankelijkheden niet wilt vastleggen, kun je deze in het bestand requirements.txt weglaten, samen met de aanduiding ==. Je vermeldt dan alleen de pakketnamen. Deze opdracht installeert dan de nieuwste versie van de opgegeven pakketten:
pip3 install -r requirements.txt
Samenvatting
In deze les heb je geleerd hoe je extra pakketten opzoekt in de Python Package Index en hoe je ze installeert met pip3. Je leerde ook met virtuele omgevingen werken en de afhankelijkheden van je projecten opslaan, zodat je ze later eenvoudig weer kunt installeren in een nieuwe virtuele omgeving. Hiermee komen we bijna aan het einde van onze lessenreeks voor beginners. In de laatste les gaan we een volledig Python-script ontwikkelen dat je op de opdrachtregel kunt uitvoeren.
Opdracht
Installeer de module arrow in je globale Python-omgeving en controleer of je ze kunt importeren. Maak dan een nieuwe virtuele omgeving en verifieer dat de module arrow daar niet beschikbaar is. Installeer daarna ook arrow in je virtuele omgeving, zodat je de module daar kunt importeren.
Uitwerking
pip3 install arrow python3 -c 'import arrow' Na de installatie van arrow met pip3 kun je de Python-interpreter opstarten en daar import arrow intypen, maar met de optie -c kun je ook rechtstreeks Python-opdrachten als argumenten aan de Python-interpreter doorgeven, wat hier handig is om snel te controleren of we de module arrow kunnen importeren. Maak daarna een nieuwe virtuele omgeving en activeer ze: python3 -m venv C:\pad\naar\mijnomgeving C:\pad\naar\mijnomgeving\Scripts\activate.bat Als we nu de module arrow willen importeren met deze opdracht: python3 -c 'import arrow' Dan krijgen we een foutmelding: Traceback (most recent call last): *File "
Cheatsheet
Afhankelijkheden: de pakketten die een stukje Python-software nodig heeft voor zijn werking. Bibliotheek: een verzameling code die bedoeld is om door andere programma’s gebruikt te worden. Pakket: een verzameling van een of meerdere Python-modules. Repository: een online opslagplaats met pakketten. Softwarelicentie: een vergunning om een computerprogramma te gebruiken, vaak onder specifieke voorwaarden. Standaardbibliotheek: alle modules die bij een standaardinstallatie van Python beschikbaar zijn. Virtuele omgeving: een directory met een afgescheiden installatie van Python en Python-modules.