Python package management met poetry

Package management is bij Python essentieel om de werking van je scripts en code te garanderen. De mogelijkheid tot het installeren van packages is een groot voordeel, maar als je packages niet op de juiste manier beheert loop je het risico dat code niet meer werkt wanneer je dit in een andere omgeving of op een andere pc runt dan waar het oorspronkelijk geschreven is, aangezien de geïnstalleerde versie van zowel Python als de bijbehorende packages per omgeving kan verschillen. Binnen organisaties of teams waarin meerdere data scientists aan dezelfde code werken is dit onwenselijk.

Om dit probleem op te lossen zijn er meerdere mogelijkheden, maar de meest populaire methode voor package management is momenteel Poetry. De voornaamste reden hiervoor is dat Poetry van alle opties veruit het meest simpel is, maar tegelijkertijd biedt het wel alles wat je nodig hebt. De belangrijkste functionaliteiten zijn:

  1. Packages (dependencies) kunnen op een eenvoudige manier worden geïnstalleerd en beheerd
  2. Code wordt uitgevoerd in een virtuele omgeving met de juiste packages met de juiste versie. Hierdoor krijg je altijd hetzelfde resultaat, ongeacht waar de code wordt uitgevoerd.

Ook interessant: wat zijn virtual environments in Python en hoe maak ik ze?

Installatie van Poetry

Uiteraard moet je eerst Python installeren voordat je met Poetry aan de slag kunt.

Poetry installeren kan met met één commando.

Linux/macOS:

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

Windows (gebruik hiervoor PowerShell):

(Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py -UseBasicParsing).Content | python -

Controleer nu of de installatie gelukt is met het volgende commando:

poetry --version

Je krijgt als output iets als Poetry version 1.1.4 te zien. Je bent nu klaar om Poetry te gebruiken en Poetry commando's uit te voeren beginnend met poetry.

Met vertrouwen waardevolle inzichten halen uit data? Schrijf je in voor een van onze trainingen.



Gebruik Poetry voor package management

We starten een nieuw project:

poetry new poetry-test

Er wordt nu automatisch een map aangemaakt met de juiste structuur. Je kan ook in een bestaande map Poetry toevoegen:

cd bestaand-project
poetry init

In deze map staat onder andere het bestand pyproject.toml, hierin worden alle benodigde packages met daarbij het versienummer gedefinieerd. Standaard ziet dit bestand er als volgt uit:

[tool.poetry]
name = "poetry-test"
version = "0.1.0"
description = ""
authors = ["Data Science Partners <info@datasciencepartners.nl>"]

[tool.poetry.dependencies]
python = "^3.9"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"`
`

Het belangrijkste gedeelte staat onder [tool.poetry.dependencies]. Momenteel staat hier alleen de Python versie, hetgeen overeen komt met de versie van Python die je zelf geïnstalleerd hebt. Het dakje voor ^3.9 betekent dat je minimaal Python 3.9 nodig hebt. Indien je lokaal Python 3.9.1 hebt geïnstalleerd is het ook goed.

Voeg een package toe aan het Python project

Om een package te installeren gebruik je normaliter pip install, maar nu gebruiken we poetry add. Installeer bijvoorbeeld Pandas als volgt:

poetry add pandas

Nu is pyproject.toml geupdatet met daarin een expliciete definitie van de versie van Pandas:

[tool.poetry.dependencies]
python = "^3.9"
pandas = "^1.2.2"

Wederom zie je hier staan dat de code nu zal werken met Pandas versie 1.2.2 of hoger. Indien je later het package update via poetry update, dan zal de meest recente versie van Pandas worden geïnstalleerd, bijvoorbeeld 1.2.4. Indien dit niet wenselijk is, kan je het dakje verwijderen zodat altijd exact versie 1.2.2 geïnstalleerd zal zijn:

pandas = "1.2.2"

Om te testen of het package ook daadwerkelijk werkt maken we een simpel script aan dat het package Pandas gebruikt genaamd test.py:

import pandas as pd
d = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data=d)
print(df)

We voeren het script uit als volgt:

poetry run python test.py

De output is als volgt:

   col1  col2
0 1 3
1 2 4

We hebben nu succesvol een simpel script gerund met Poetry, waarbij alle afhankelijkheden expliciet zijn gedefinieerd in pyproject.toml, waardoor de code zal werken ongeacht de omgeving.

Met vertrouwen waardevolle inzichten halen uit data? Schrijf je in voor een van onze trainingen.


Installeer packages van een bestaand Poetry project

Het kan zijn dat je wel een pyproject.toml file hebt waarin packages gedefinieërd staan, maar dat je de packages nog niet hebt geïnstalleerd, bijvoorbeeld als je code van downloadt van Git.

Je kan de benodigde packages met één commando allemaal installeren:

poetry install

Alle packages die nog niet aanwezig zijn in de virtuele Poetry omgeving zullen dan worden geïnstalleerd. Je kan dit ook testen door zelf pyproject.toml aan te passen.

Packages verwijderen

Het kan zijn dat bepaalde packages niet meer nodig zijn. Om je project schoon te houden is het raadzaam deze dan te deïnstalleren, dat kan ook eenvoudig met Poetry:

poetry remove pandas

Conclusie m.b.t. package mangement met Poetry

Zoals je hebt gezien is package management met Poetry erg eenvoudig. Er zijn eigenlijk geen nadelen maar wel veel voordelen. Met name als je met meerdere mensen aan dezelfde code werkt is Poetry zeer handig, op een zeer eenvoudige manier garandeer je de werking van je code onafhankelijk van waar deze wordt uitgevoerd. Op GitHub is Poetry met meer dan 14.000 sterren daarom ook zeer populair.

Wil je nog veel meer leren over Python en de mogelijkheden voor data analyse? Schrijf je dan in voor onze Python cursus voor data science, onze machine learning training, of voor onze data science opleiding en leer met vertrouwen te programmeren en analyseren in Python. Nadat je een van onze trainingen hebt gevolgd kun je zelfstandig verder aan de slag. Je kunt ook altijd even contact opnemen als je een vraag hebt.

Download één van onze opleidingsbrochures voor meer informatie

by: