Tipp: Python virtual environment (venv)
Bei der Arbeit mit ‘Python’ kommt es recht häufig vor, dass bestimmte Versionen
von Bibliotheken per pip
installiert und genutzt werden, die von der
Distribution nicht zur Verfügung gestellt werden.
Um dieses Problem zu umgehen kann das Projekt in ein virtual environment
(venv)
gepackt werden. Dabei wird eine Verknüpfung zu den Binaries von python
und
pip
erzeugt und alle Pfade für die Installation von Bibliotheken in das
venv Verzeichnis umgebogen.
So kann mit pip
jede benötigte Bibliothek installiert und benutzt werden ohne
die Konfiguration des Rechners selber zu verändern.
Einrichten des venv Verzeichnisses
Um das Verzeichnis einzurichten müssen auf dem System die Python Bibliotheken
virtualenv
und pip
installiert sein. Unter Arch Linux sind das die Pakete
python-pip
und python-venv
. (Dies sind die Pakete für die Python 3
Installation.)
Dann kann das Projektverzeichnis erstellt und in dem Verzeichnis ein venv eingerichtet werden:
user@linux ~ $ mkdir projekt
user@linux ~ $ cd projekt
user@linux ~ $ python -m venv env
user@linux ~ $ ls env
bin include lib lib64 pyvenv.cfg
Im Verzeichnis wurde jetzt eine Konfiguration hinterlegt und die Grundstruktur für die späteren Bibliotheken angelegt.
virtual environment aktivieren
Damit in der Folge die Umgebung genutzt wird, muss sie innerhalb der Shell aktiviert werden:
user@linux ~ $ cd projekt
user@linux projekt $ . env/bin/activate
user@linux projekt (projekt) $
Je nach Shell wird jetzt auch im Prompt angezeigt, dass man sich im virtual environment projekt befindet.
Alle Aufrufe von python
oder pip
werden nun durch die in env/bin
verlinkten
Kommandos durchgeführt.
Bibliotheken installieren
Die Installation von Bibliotheken erfolgt jetzt über Aufruf per pip install
dabei löst pip
auch die notwendigen Abhängigkeiten auf. Sollte dennoch eine
Bibliothek Probleme melden, ist das meist eine fehlende Library, die dann über
die Distribution nachinstalliert werden muss.
Als Beispiel installieren wir die Bibliothek requests
über die URLs abgerufen
werden können:
user@linux ~/projekt (projekt) $ pip install requests
Collecting requests
Using cached requests-2.25.1-py2.py3-none-any.whl (61 kB)
Collecting chardet<5,>=3.0.2
Using cached chardet-4.0.0-py2.py3-none-any.whl (178 kB)
Collecting idna<3,>=2.5
Using cached idna-2.10-py2.py3-none-any.whl (58 kB)
Collecting certifi>=2017.4.17
Using cached certifi-2020.12.5-py2.py3-none-any.whl (147 kB)
Collecting urllib3<1.27,>=1.21.1
Using cached urllib3-1.26.4-py2.py3-none-any.whl (153 kB)
Installing collected packages: chardet, idna, certifi, urllib3, requests
Successfully installed certifi-2020.12.5 chardet-4.0.0 idna-2.10 requests-2.25.1 urllib3-1.26.4
WARNING: You are using pip version 20.2.3; however, version 21.1 is available.
You should consider upgrading via the '/home/mgisbers/projekt/bin/python -m pip install --upgrade pip' command.
Die installierten Versionen werden sich unterscheiden. Um feste Version
anzugeben werden diese hinter dem Bibliothek-Namen angegeben. Z. B. pip install requests==2.25.1
Mehr dazu in der Dokumentation von pip
.
venv im Script nutzen
Damit die Scripte genau das verlinkte python
Kommando benutzten muss der Pfad
entweder absolut oder relativ zum Pfad des Scripts angegeben werden. Der
absolute Pfad lässt sich über which
herausfinden:
user@linux ~/projekt (projekt) $ which python
/home/user/projekt/env/bin/python
Der relative Pfad ist env/bin/python
.
In einem Script wird dann der entsprechende shebang gesetzt:
Beispiel Script test.py
:
#! /home/user/projekt/env/bin/python
import requests
r = requests.get('https://showipv6.de/short')
print(r.text)
Nachdem das Beispiel ausführbar gemacht wurde kann es wie jedes Python Script aufgerufen werden.
user@linux ~/projekt (projekt) $ chmod +x test.py
user@linux ~/projekt (projekt) $ ./test.py
Diese Script erzeugt einen GET - Request auf ShowIPv6 und holt die aktuelle IP Adresse des Rechners ab. Weitere Infos zur Requests Bibliothek.
Version einfrieren
pip
bietet die Möglichkeit die Versionen der Bibliotheken einzufrieren und in
eine Datei zu speichern aus der sie bei Bedarf wieder installiert werden
können. Dies ist unter anderem bei verteilt genutzten Projekten sinnvoll um an
allen Stellen mit den gleichen Bibliotheken zu arbeiten.
user@linux ~/projekt (projekt) $ pip freeze >requirements.txt
Bibliotheken mit requirements.txt
installieren
Um die eingefrorenen Versionen zu benutzen wird die requirements.txt
Datei
bei der Installation als Quelle der Bibliotheken angegeben.
user@linux ~/projekt (projekt) $ pip install -r requirements.txt
Dadurch wird genau der Zustand der seitens der Bibliotheken zum Zeitpunkt des einfrieren gegeben war wiederhergestellt.
Bibliotheken updaten
Es ist zwar möglich einzelne Bibliotheken direkt mittels pip
aktualisieren zu
lassen (pip install -U requests
) um alle Bibliotheken innerhalb des Projektes
zu aktualisieren ist allerdings ein komplexerer Aufruf notwendig:
user@linux ~/projekt (projekt) $ pip list --outdated --format=freeze | \
grep -v '^\-e' | cut -d = -f 1 | \
xargs -n1 pip install -U
Hierbei wird eine Liste der veralteten Pakete erzeugt und dies nach entfernen
der Versionsnummer durch pip
aktualisiert.
Nach dem Update und dem erfolgreichen Test des Projektes, sollten die Versionen
wieder in eine requirements.txt
Datei eingefroren werden.
virtual environment aktualisieren
Auch das venv sollte nach Updates der Python - Versionen in der Distribution aktualisiert werden:
user@linux ~/projekt (projekt) $ python -m venv --upgrade env
Dabei werden alle Verknüpfungen innerhalb des venv aktualisiert.