virtuelle Umgebungen (virtual environments) lösen in Python das Problem verschiedener Modulversionen in unterschiedlichen Projekten auf.
Es passiert nicht selten, dass Projekt A
von Modul M
die Version 1.0 benötigt, aber ein neues Projekt B
die Version 2.0 von M
benutzen soll.
Wir haben bisher externe Module immer mit pip
oder apt
global installiert, jedes Pythonprogramm benutzte immer dieselbe Version der Module. Jetzt will ich dir zeigen, wie du Versionskonflikte auflösen kannst und die Entwicklung in abgegrenzten virtuellen Umgebungen durchführst.
virtuelle Umgebungen einrichten
Zunächst musst du die benötigten Kommandos über apt installieren
sudo apt install python3-virtualenv
Dann erfolgt mit dem Kommando virtualenv, die Anlage des Projektverzeichnisses inklusive der virtuellen Umgebung
virtualenv teil20
Das Kommando legt nicht nur das Projektverzeichnis sondern auch einige Unterverzeichnisse an. Das sieht dann etwa so aus:
Üblicherweise findest du im neu angelegten Projektverzeichnis folgenden Inhalt:
- Verzeichnis
bin
– enthält die Kommandos, die auf diese virtuelle Umgebung bezogen sind, teilweise sogar abhängig von der Version des Pythoninterpreters. - Verzeichnis
lib
– Hier liegen die in dieser virtuellen Umgebung installierten Module und Libraries. Da sie im Projektverzeichnis abgelegt sind, kommt es nicht zu Konflikten mit anderen Projekten. - Datei
pyvenv.cfg
– Konfigurationsdatei dieser virtuellen Umgebung (siehe unten)
virtuelle Umgebung aktivieren
Zunächst wechselst du in das neu angelegte Verzeichnis
cd teil20
Wirf mal einen kurzen Blick ins bin Verzeichnis mit ll bin
Alle Kommandos, die hier liegen, beziehen sich immer nur auf diese spezielle virtuelle Umgebung. Andere virtuelle Umgebungen bringen ihr eigenes bin
Verzeichnis mit.
Der Pythoninterpreter und das pip3 Kommando werden momentan global vom System benutzt. Ein which pip3
wird dir jetzt noch /usr/bin/pip3
ausgeben. Also aktiviere die virtuelle Umgebung mit
source bin/activate
Das erste, was dir auffallen dürfte, ist, dass sich das Prompt der bash geändert hat. Es steht jetzt (teil20) davor. Daran siehst du, welche virtuellen Umgebung aktuell aktiv ist. Ein neuerliches which pip3
gibt dir jetzt folgendes aus: /home/pi/git/pythonkurs/teil20/bin/pip3
. Dadurch ist sichergestellt, dass pip3 immer zu deiner virtuellen Umgebung passt. Gleiches gilt auch für den Pythoninterpreter. Du könntest irgendwann in einer anderen Umgebung Python 4 installieren, ohne dass die anderen Projekte das mitbekommen.
Modul installieren
Mit der aktivierten virtuellen Umgebung installieren wir jetzt mal das requests Modul
pip install requests
Dieses Modul wird jetzt nur innerhalb der aktiven virtuellen Umgebung installiert und kann von anderen Projekten nicht benutzt werden (außer, du installierst es dort auch).
Mit pip list
kannst du dir alle installierten Abhängigkeiten der Umgebung anzeigen lassen.
In der Liste findest du alle Package mit Versionsnummer, auf die du in der Umgebung zugreifen kannst.
Zweite Umgebung
Jetzt richten wir im Projektverzeichnis eine zweite virtuelle Umgebung ein
virtualenv teil20a
cd teil20a
source bin/activate
Kontrollieren wir mal, welche Packages installiert sind
pip list
Du siehst, das requests Modul ist in dieser Umgebung nicht vorhanden und unsere beiden virtuellen Umgebungen sind klar voneinander getrennt.
pyvenv.cfg
Bei der Erzeugung der virtuellen Umgebung wurde auch die Datei pyvenv.cfg angelegt. Diese hat auf meinem Raspberry Pi folgenden Inhalt
home = /usr/bin
implementation = CPython
version_info = 3.11.2.final.0
virtualenv = 20.17.1+ds
include-system-site-packages = false
base-prefix = /usr
base-exec-prefix = /usr
base-executable = /usr/bin/python3
Diese Datei enthält Informationen zu virtuellen Umgebung, wie z.B. den installierten Pythoninterpreter (home, base-executable, implementation, version_info
) sowie Flags und Informationen der Umgebung selbst ( virtualenv, include-system-packages
). Ich habe diese Datei nur selten bearbeiten müssen.
virtuelle Umgebung übertragen
Jetzt möchte ich dir noch zeigen, wie du eine virtuelle Umgebung auf einen anderen Computer übertragen kannst. Beispielweise vom Entwicklungsrechner auf den Server.
Zunächst zeigen wir uns einmal alle installierten Module in der Umgebung teil20 an:
pip freeze
Dieses Kommando arbeitet ähnlich wie pip list
, aber das Ausgabeformat ist anders.
Ich habe hier in der Umgebung teil20
noch die Module numpy und pandas mit ihren Abhängigkeiten installiert, daher ist die Liste jetzt etwas länger geworden. Das Ausgabeformat von pip freeze entspricht der Konvention für die Datei requirements.txt (auch dieser Dateiname ist per Konvention festgelegt). Daher leite ich die Ausgabe in die Datei hinein.
pip freeze >requirements.txt
Auf einem zweiten Raspberry Pi lege ich jetzt eine virtuelle Umgebung teil20b
an.
virtualenv teil20b
Als nächstes kopiere ich die requirements.txt auf den zweiten Raspi ins teil20b Verzeichnis.
Um in der Umgebung teil20b
alle Module aus der requirements.txt zu installieren nutze ich den folgenden Befehl:
pip install -r requirements.txt
Damit arbeitet pip die requirements.txt
zeilenweise ab und installiert alle dort aufgelisteten Module in der jeweiligen Version in der virtuellen Umgebung teil20b
.
Falls du das nachvollziehen möchtest: Nicht ungeduldig werden. Gerade die Installation des pandas Modul kann eine ganze Weile brauchen und möglicherweise sogar mit einer Fehlermeldung abbrechen. Im letzteren Fall könnte ein sudo apt install cmake
die Lösung sein.
Tipps
Du kannst virtuelle Umgebungen nicht nur benutzen, um verschiedene Projekte voneinander zu trennen, sondern auch ein Projekt in verschiedenen Versionen zu testen.
Die häufigste Fehlerquelle ist meistens, nicht die korrekte Umgebung aktiviert zu haben. Das wird mit etwas Übung aber besser werden.
Halte immer ein Backup einer funktionierenden requirements.txt
bereit, damit du schnell wieder auf einen lauffähigen Stand zurücksetzen kannst, falls etwas schief gehen sollte.
Im nächsten Teil beschäftigen wir uns mit Signalen & Interrupts.