Abhängigkeiten je Projekt

Was ist eine virtuelle Umgebung in Python?

venv, Virtual Environment

Eine virtuelle Umgebung (venv) ist ein Ordner, in dem Python einen eigenen Verweis auf den Interpreter und ein eigenes Verzeichnis für installierte Pakete anlegt. Was du dort installierst, gilt nur für dieses eine Projekt, die Systeminstallation und andere Projekte bleiben unberührt.

Zwei Python-Projekte auf demselben Rechner brauchen selten dieselbe Version einer Bibliothek, und ohne getrennte Umgebungen gewinnt immer die zuletzt installierte.

KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
Erstellen
python -m venv .venv
Verlassen
deactivate
Eingebaut
Seit Python 3.3 als Modul venv
Verwechselt mit
Container, conda und virtueller Maschine

Warum Projekte sich ohne Trennung gegenseitig stören

Ohne virtuelle Umgebung landet jede Installation mit pip im selben Paketverzeichnis des Interpreters. Braucht ein Projekt eine Bibliothek in Version 1 und das nächste dieselbe Bibliothek in Version 2, gewinnt die zuletzt installierte, und das andere Projekt bricht an einer Stelle ab, die niemand angefasst hat. Mit einer Umgebung je Projekt hat jedes seinen eigenen Satz an Paketen in genau den Versionen, die es braucht.

Unter Linux kommt hinzu, dass die Distribution eigene Python-Pakete installiert und Systemwerkzeuge davon abhängen. Viele aktuelle Distributionen, darunter Debian und Ubuntu, markieren ihr System-Python deshalb nach PEP 668 als extern verwaltet. Ein pip install außerhalb einer Umgebung bricht dann mit der Meldung „externally-managed-environment“ ab. Die virtuelle Umgebung ist der vorgesehene Ausweg, nicht das Umgehen der Sperre.

Virtuelle Umgebung erstellen, aktivieren und verlassen

Im Projektordner legst du die Umgebung mit einem Befehl an, aktivierst sie, installierst Pakete und verlässt sie wieder. Welcher Befehl die Umgebung aktiviert, hängt von der Shell ab:

ShellAktivieren
bash und zsh (Linux, macOS)source .venv/bin/activate
fishsource .venv/bin/activate.fish
Windows, Eingabeaufforderung.venv\Scripts\activate.bat
Windows, PowerShell.venv\Scripts\Activate.ps1

Unter Linux und macOS sieht der ganze Ablauf so aus:

python3 -m venv .venv            # Umgebung im Ordner .venv anlegen
source .venv/bin/activate        # aktivieren, der Prompt zeigt jetzt (.venv)
python -m pip install requests   # Paket nur in diese Umgebung installieren
deactivate                       # Umgebung verlassen

Verlassen funktioniert in jeder Shell mit deactivate. Schließt du das Terminal, ist die Umgebung ebenfalls nicht mehr aktiv, denn die Aktivierung gilt immer nur für die aktuelle Shell. Bei conda heißt der Befehl dagegen conda deactivate.

Unter Windows legst du die Umgebung mit py -m venv .venv an. Verweigert PowerShell das Aktivierungsskript, erlaubt Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser lokale Skripte für deinen Benutzer. Unter Debian und Ubuntu fehlt das Modul venv in der Grundinstallation manchmal, dann installierst du das Paket python3-venv nach.

Was im Ordner .venv steckt

Eine virtuelle Umgebung ist keine Kopie von Python. Sie besteht aus der Datei pyvenv.cfg, die auf die zugrunde liegende Python-Installation verweist, einem Ordner bin (unter Windows Scripts) mit einem Verweis auf den Interpreter, pip und den Aktivierungsskripten, und einem eigenen Paketverzeichnis site-packages. Python erkennt beim Start an der pyvenv.cfg, dass es in einer Umgebung läuft, und sucht Pakete nur dort.

Aktivieren bedeutet technisch nur, dass der Ordner bin der Umgebung vorne in den Suchpfad PATH gestellt und die Variable VIRTUAL_ENV gesetzt wird. Deshalb kannst du das Aktivieren auch weglassen und den Interpreter direkt aufrufen, etwa mit .venv/bin/python skript.py. Das Ergebnis ist dasselbe.

Der Name .venv ist eine Konvention, kein Zwang. Viele Werkzeuge, darunter Editoren wie Visual Studio Code und der Paketmanager uv, suchen aber genau diesen Ordner im Projekt und nutzen ihn automatisch. Seit Python 3.13 legt venv in der Umgebung außerdem eine eigene .gitignore an, damit der Ordner nicht versehentlich im Repository landet.

Wie venv, pip, Poetry und uv zusammenspielen

venv baut die Umgebung, pip füllt sie. Die Liste der Pakete hältst du klassisch in einer requirements.txt fest, erzeugt mit pip freeze > requirements.txt, und stellst sie auf einem anderen Rechner mit pip install -r requirements.txt wieder her. Diese Datei mischt allerdings die gewollten Pakete mit allem, was diese nachziehen. Deshalb führen viele Projekte die direkten Abhängigkeiten getrennt von einer erzeugten Liste mit exakten Versionen.

Poetry, pipenv und uv fassen beide Aufgaben zusammen. Sie lesen die gewünschten Pakete aus einer Projektdatei, meist der pyproject.toml, lösen die Abhängigkeiten auf, schreiben das Ergebnis in eine Lock-Datei und legen die virtuelle Umgebung selbst an. uv legt sie als .venv im Projektordner ab, Poetry und pipenv standardmäßig in einem zentralen Verzeichnis. Unter der Haube bleibt es in allen Fällen eine gewöhnliche virtuelle Umgebung, nur dass du sie nicht mehr von Hand anlegst und aktivierst.

Fehler, die immer wieder auftauchen

Der Klassiker ist die vergessene Aktivierung. Das Paket ist installiert, der Import schlägt trotzdem mit ModuleNotFoundError fehl, weil die Installation in einer anderen Umgebung oder im System-Python gelandet ist. Die schnelle Kontrolle ist which python unter Linux und macOS beziehungsweise where python unter Windows. Gewöhn dir außerdem python -m pip install statt pip install an, dann gehört pip garantiert zu dem Interpreter, den du gerade meinst.

Zweiter Dauerbrenner ist die verschobene oder kopierte Umgebung. Die Skripte in bin enthalten absolute Pfade, eine Umgebung lässt sich deshalb weder in einen anderen Ordner verschieben noch auf einen anderen Rechner kopieren. Dasselbe gilt nach einem Update der zugrunde liegenden Python-Version, wenn der alte Interpreter entfernt wurde. In allen Fällen ist die Lösung, die Umgebung zu löschen und aus der Abhängigkeitsliste neu aufzubauen.

KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
Nicht verwechseln

Virtuelle Umgebung und was oft damit gleichgesetzt wird

Virtuelle Umgebung gegen Container

Ein Container isoliert ein ganzes Dateisystem samt Systembibliotheken, eine virtuelle Umgebung nur die Python-Pakete. Setzt ein Paket eine C-Bibliothek in einer bestimmten Version voraus, hilft venv nicht weiter, ein passendes Image dagegen schon.

Virtuelle Umgebung gegen conda-Umgebung

conda verwaltet neben Python-Paketen auch Bibliotheken außerhalb der Python-Welt und die Interpreter-Version selbst und bezieht sie aus eigenen Quellen. Bei Data Science und Numerik ist das ein Vorteil, im Mischbetrieb mit pip entstehen aber leicht Umgebungen, in denen niemand mehr sagen kann, woher ein Paket stammt.

Virtuelle Umgebung gegen pyenv

pyenv installiert mehrere Python-Versionen nebeneinander und wechselt zwischen ihnen, trennt aber keine Pakete. Beides ergänzt sich: pyenv bestimmt, welcher Interpreter läuft, die virtuelle Umgebung, welche Pakete er sieht.

Virtuelle Umgebung gegen Virtuelle Maschine

Eine virtuelle Maschine bildet über einen Hypervisor einen ganzen Rechner mit eigenem Betriebssystem nach. Mit der virtuellen Umgebung in Python hat sie außer dem Wortteil nichts gemein.

KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
In der Praxis

Die Umgebung muss auch dort ankommen, wo kein Terminal offen ist

Am eigenen Rechner aktivierst du die Umgebung im Terminal und vergisst sie danach. Editoren, geplante Aufgaben und Dienste kennen diese Aktivierung aber nicht. In Visual Studio Code oder PyCharm wählst du deshalb den Interpreter aus .venv einmal ausdrücklich für das Projekt aus, sonst laufen Tests und Debugger mit dem System-Python und melden fehlende Pakete, die nachweislich installiert sind.

Für Cronjobs und Dienste unter systemd gilt dasselbe. Statt dich auf die Aktivierung zu verlassen, trägst du den vollständigen Pfad zum Interpreter der Umgebung ein, etwa /opt/app/.venv/bin/python. In einer CI/CD-Pipeline wird die Umgebung bei jedem Lauf frisch aus der Lock-Datei gebaut, so fallen fehlende oder falsch gepinnte Abhängigkeiten auf, bevor sie in Produktion gehen.

Für den Betrieb leistet die Umgebung nicht dasselbe wie ein Container. Sie trennt Python-Pakete, aber keine Systembibliotheken, Compiler oder die Python-Version selbst. Erwartet ein Paket eine C-Bibliothek, die auf dem Zielsystem fehlt, bricht die Installation dort ab, egal wie sauber die Umgebung angelegt ist. Viele Teams legen deshalb auch im Container eine Umgebung an, damit der Pfad zu den Paketen unabhängig vom Basis-Image gleich bleibt.

Virtuelle Umgebung lernen

Wie du ein Projekt sauber aufsetzt, Abhängigkeiten festhältst und eigene Pakete baust, behandeln die Python-Trainings für Entwicklerteams an durchgehenden Beispielen.

Eine reproduzierbare Umgebung ist auch die Grundlage für verlässliche Testläufe, worum es in den Trainings zu automatisierten Testläufen ausführlich geht.

Häufige Fragen

Was ist der Unterschied zwischen venv und virtualenv?
virtualenv ist das ältere, separat installierte Paket, aus dem die Idee stammt. venv ist seit Python 3.3 in der Standardbibliothek enthalten und deckt den Alltag vollständig ab. virtualenv wird weiter gepflegt und kann zum Beispiel Umgebungen für andere installierte Python-Versionen anlegen, für die meisten Projekte reicht venv aber aus.
Wie sehe ich, ob gerade eine Umgebung aktiv ist?
Der Prompt zeigt den Namen der Umgebung in Klammern, etwa (.venv). Verlässlicher ist which python, das auf den Ordner der Umgebung zeigen muss. In Python selbst prüfst du es mit sys.prefix != sys.base_prefix, das in einer Umgebung True ergibt.
Brauche ich für jedes kleine Skript eine eigene Umgebung?
Für ein Skript, das nur die Standardbibliothek benutzt, nicht. Sobald eine externe Abhängigkeit dazukommt, lohnt sich der eine Befehl, weil sich sonst immer mehr Pakete in der Systeminstallation ansammeln. Für Kommandozeilenwerkzeuge, die du überall brauchst, gibt es pipx, das jedem Werkzeug im Hintergrund eine eigene Umgebung gibt.
Gehört der Ordner .venv ins Git-Repository?
Nein. Trag ihn in die .gitignore ein, falls Python das nicht schon selbst erledigt hat, und versioniere stattdessen die Abhängigkeitsdatei samt Lock-Datei. Damit baut jede Person im Team dieselbe Umgebung mit einem Befehl neu auf, statt mehrere hundert Megabyte Binärdateien zu übertragen.
Was mache ich, wenn eine Umgebung kaputt ist?
Löschen und neu anlegen. Eine virtuelle Umgebung ist ein Wegwerfartikel, in ihr liegt kein eigener Code, alles Wichtige steht in der Abhängigkeitsdatei. Scheitert schon der Neuaufbau, liegt der Fehler in dieser Datei und nicht in der Umgebung.

Passt thematisch dazu

Für ein einzelnes Skript oder in einem Container lohnt der Aufwand nicht immer, und die Fälle, in denen du dir den Schritt sparen kannst, lassen sich klar benennen.

venv baut nur den Ordner, die eigentliche Entscheidung ist, welches Werkzeug die Abhängigkeiten festhält.

Persönlich für dich da

Deine Ansprechpartner

Du willst das Thema nicht nur nachschlagen, sondern anwenden können? Wir beraten dich persönlich und kostenlos.

Yves Hoppe

Yves Hoppe

Weiterbildung & Beratung

Ordnet mit dir ein, welcher Kurs zu deinem Vorwissen passt.

Norbert Jansen

Norbert Jansen

Beratung & Inhouse

Plant Inhouse-Trainings, die an euren eigenen Daten und Abläufen ansetzen.

Virtuelle Umgebung im Kurs statt im Lexikon

Nachschlagen bringt dich bis zum Verstehen. Anwenden lernst du an echten Aufgaben.