Python virtuelle Umgebungen

virtuelle Umgebungen (virtual environments) lösen in Python das Problem verschiedener Modulversionen in unterschiedlichen Projekten auf.

1Python Programmierkurs
2Python: Methoden
3Kontrollstrukturen
4Strings in Python
5Container
6Objekte in Python
7Module
8Exceptions in Python
9Typkonvertierung
10Python und Dateien
11Datum und Zeit mit Python verarbeiten
12Multithreading
13Netzwerk in Python
14Logging in Python
15GPIO
16Automatische Tests
17Datenbanken mit Python
18Python: Generatoren und List Comprehension
19Python: Webseiten mit Flask
20Python virtuelle Umgebungen
21Interrupts & Signale
22NumPy
23Matplotlib
24match
25Reguläre Ausdrücke
26lambda Funktionen
27logging.config
28Decorators

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.

Python Logo (CC-BY-SA The people from the Tango! project / Wikipedia)
virtuelle Umgebungen
Python Logo (CC-BY-SA The people from the Tango! project / Wikipedia)

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:

Das Projektverzeichnis wurde mit den Unterverzeichnissen bin und lib, sowie der Konfigurationsdatei pyvenv.cfg angelegt.
Olli Graf -raspithek.de
virtualenv-createCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Das Projektverzeichnis wurde mit den Unterverzeichnissen bin und lib, sowie der Konfigurationsdatei pyvenv.cfg angelegt.

Ü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

Directorylisting von bin
Olli Graf -raspithek.de
content-binCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Directorylisting von 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 der Package ist auch unser installiertes requests Modul mit Versionsnummer zu finden.
Olli Graf -raspithek.de
pip-listCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
In der Liste der Package ist auch unser installiertes requests Modul mit Versionsnummer zu finden.

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
pip list in der Umgebung teil20a zeigt nur die drei initial installierten Packages.
Olli Graf -raspithek.de
pip-list-teil20aCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
pip list in der Umgebung teil20a zeigt nur die drei initial installierten Packages.

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.

Liste der installierten Module mit Versionsnummern über pip freeze.
Olli Graf -raspithek.de
pip-freezeCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Liste der installierten Module mit Versionsnummern über pip freeze.

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.

In der virtuellen Umgebung teil20b wurden jetzt alle Module aus der requirements.txt installiert
Olli Graf -raspithek.de
pip-list-teil20bCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
In der virtuellen Umgebung teil20b wurden jetzt alle Module aus der requirements.txt installiert

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.

Schreibe einen Kommentar

Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Olli Graf - raspithek.de
WordPress Cookie Hinweis von Real Cookie Banner