Zum Inhalt springen
aviral gupta

// I5.4 · ca. 30 Min. · Aufbau

Virtuelle Umgebungen und pip

Nach dieser Lektion geben Sie jedem Projekt eine eigene virtuelle Umgebung, installieren Pakete hinein und halten sie so fest, dass jeder sie nachbauen kann.

Lektion 4 von 5 in I5 Tests und Projektwerkzeuge

Danach können Sie

  • Eine virtuelle Umgebung anlegen, aktivieren und deaktivieren und erkennen, ob Python in einer läuft
  • Pakete mit python -m pip in der aktiven Umgebung installieren und entfernen und bei Bedarf eine Version festlegen
  • Abhängigkeiten in requirements.txt festhalten, mit -r wieder installieren und .venv selbst aus Git heraushalten
  1. Aufwärmen · Aufgabe 1 von 7

    Aufwärmen aus der vorigen Lektion: total(numbers) liefert die Summe einer Liste. Welche Eingabe ist der Randfall, der am ehesten einen eigenen Test verdient?

  2. Vorhersagen · Aufgabe 2 von 7

    Sagen Sie es vorher, bevor Sie weiterlesen. Das legt eine Umgebung namens demo an und fragt deren Interpreter nach sys.prefix (Linux oder macOS). Was wird ausgegeben?

    import subprocess
    import tempfile
    import venv
    from pathlib import Path
    
    with tempfile.TemporaryDirectory() as tmp:
        env = Path(tmp) / "demo"
        venv.create(env, with_pip=False)
        python = env / "bin" / "python"
        out = subprocess.run([str(python), "-c", "import sys; print(sys.prefix)"], capture_output=True, text=True)
        print(Path(out.stdout.strip()).name)
  3. Üben · Aufgabe 3 von 7

    Setzen Sie das Modul der Standardbibliothek ein, das im Ordner .venv eine virtuelle Umgebung anlegt.

    python -m ____ .venv
    python -m .venv
  4. Üben · Aufgabe 4 von 7

    Ordnen Sie jedem Shell-Befehl zu, was er tut.

  5. Üben · Aufgabe 5 von 7

    Die Eingabeaufforderung zeigt (.venv). Sie führen python -m pip install requests aus. Wohin kommt requests?

  6. Denksport · Aufgabe 6 von 7

    Knobelaufgabe. Eine mit with_pip=False angelegte Umgebung versucht, pip zu importieren (Linux oder macOS). Was wird ausgegeben?

    import subprocess
    import tempfile
    import venv
    
    with tempfile.TemporaryDirectory() as tmp:
        venv.create(tmp, with_pip=False)
        result = subprocess.run([tmp + "/bin/python", "-c", "import pip"], capture_output=True)
        print(result.returncode)
  7. Anwenden · Aufgabe 7 von 7

    Kleine Aufgabe. Schreiben Sie setup_env.py für einen Projektordner: Es legt mit dem Modul venv .venv samt pip an, sofern .venv/pyvenv.cfg noch nicht existiert, und gibt dann den activate-Befehl für die Plattform aus, auf der es läuft. Starten Sie es zweimal auf Ihrem Rechner: Der zweite Lauf darf die Umgebung nicht neu anlegen.

    Prüfen Sie Ihr Ergebnis anhand dieser Liste

Selbst programmieren

Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.

Ausgearbeitetes Beispiel

Ein Blick in eine neue Umgebung

Dieses Programm fragt, ob es in einer virtuellen Umgebung läuft, und legt dann in einem temporären Ordner eine an, so wie python -m venv .venv, nur ohne pip, damit es schnell geht. Es listet die Schlüssel in pyvenv.cfg und startet den Interpreter der neuen Umgebung, um dieselbe Frage zu stellen. Starten Sie es auf Ihrem Rechner mit dem System-Python und dann mit einer aktivierten Umgebung und vergleichen Sie die erste Zeile.

main.py

import subprocess
import sys
import tempfile
import venv
from pathlib import Path


def in_venv() -> bool:
    """True when this interpreter runs from a virtual environment."""
    return sys.prefix != sys.base_prefix


def env_python(env: Path) -> Path:
    """The interpreter inside a virtual environment."""
    if sys.platform == "win32":
        return env / "Scripts" / "python.exe"
    return env / "bin" / "python"


print("running in a venv:", in_venv())

with tempfile.TemporaryDirectory() as tmp:
    env = Path(tmp) / ".venv"
    # python -m venv .venv does the same; with_pip=False skips installing pip.
    venv.create(env, with_pip=False)
    config = (env / "pyvenv.cfg").read_text()
    keys = [line.split("=")[0].strip() for line in config.splitlines() if "=" in line]
    print("pyvenv.cfg keys:", sorted(keys))
    check = subprocess.run(
        [str(env_python(env)), "-c", "import sys; print(sys.prefix != sys.base_prefix)"],
        capture_output=True,
        text=True,
        check=True,
    )
    print("new env's python in a venv:", check.stdout.strip())

Ausführen mit

python main.py

Ausgabe

running in a venv: False
pyvenv.cfg keys: ['command', 'executable', 'home', 'include-system-site-packages', 'version']
new env's python in a venv: True
  • Die erste Zeile ist mit dem System-Python False und True, wenn Sie das Programm aus einer aktivierten Umgebung starten.
  • home und executable in pyvenv.cfg verweisen auf das Python, aus dem die Umgebung gebaut wurde.
  • include-system-site-packages ist standardmäßig false, die Umgebung sieht also keines der Pakete des Systems.
  • Der neue Interpreter meldet True ohne jede Aktivierung: Ihn über seinen vollen Pfad zu starten genügt.

Übungen

Übung 1 von 2

Wo laufe ich?

Vervollständigen Sie zwei Hilfsfunktionen. in_venv() liefert True, wenn der laufende Interpreter in einer virtuellen Umgebung steckt, mit der Prüfung, die die venv-Dokumentation empfiehlt. env_python(env, platform) liefert den Pfad des Interpreters im Umgebungsordner env: Scripts/python.exe, wenn platform "win32" ist, sonst bin/python. Starten Sie es auf Ihrem Rechner mit und ohne aktivierte Umgebung und beobachten Sie die erste Zeile.

Diese Übung braucht Python auf Ihrem Computer (die Browser-Version kann sie nicht ausführen). Dateien und Befehle stehen unten.

Hinweise
  1. Hinweis 1

    Die venv-Dokumentation: Es genügt, sys.prefix != sys.base_prefix zu prüfen.

  2. Hinweis 2

    Vergleichen Sie das Argument platform, nicht sys.platform, damit die Tests auf jedem Rechner nach Windows fragen können.

  3. Hinweis 3

    if platform == "win32": return env / "Scripts" / "python.exe"

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

import sys
from pathlib import Path


def in_venv() -> bool:
    """True when this interpreter runs from a virtual environment."""
    return sys.prefix != sys.base_prefix


def env_python(env: Path, platform: str = sys.platform) -> Path:
    """The interpreter inside the virtual environment env, for this platform."""
    if platform == "win32":
        return env / "Scripts" / "python.exe"
    return env / "bin" / "python"


if __name__ == "__main__":
    print("in a venv:", in_venv())
    print("interpreter:", env_python(Path(".venv")))
Auf dem eigenen Computer ausführen

Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.py

import sys
from pathlib import Path


def in_venv() -> bool:
    """True when this interpreter runs from a virtual environment."""
    # Compare the two prefixes the venv docs name.
    return False


def env_python(env: Path, platform: str = sys.platform) -> Path:
    """The interpreter inside the virtual environment env, for this platform."""
    # Windows ("win32") keeps it somewhere else.
    return env / "bin" / "python"


if __name__ == "__main__":
    print("in a venv:", in_venv())
    print("interpreter:", env_python(Path(".venv")))

test_main.py

import sys
from pathlib import Path
from unittest.mock import patch

import main


def test_in_venv_true():
    """in_venv() ist True, wenn sys.prefix von sys.base_prefix abweicht"""
    with patch.object(sys, "prefix", "/project/.venv"), patch.object(sys, "base_prefix", "/usr/local"):
        assert main.in_venv() is True, "die Präfixe unterscheiden sich, also ist das eine virtuelle Umgebung"


def test_in_venv_false():
    """in_venv() ist False, wenn beide Präfixe gleich sind"""
    with patch.object(sys, "prefix", "/usr/local"), patch.object(sys, "base_prefix", "/usr/local"):
        assert main.in_venv() is False, "die Präfixe sind gleich, also ist das keine virtuelle Umgebung"


def test_posix_path():
    """Unter Linux und macOS ist der Interpreter bin/python"""
    for platform in ("linux", "darwin"):
        got = main.env_python(Path(".venv"), platform)
        assert got == Path(".venv", "bin", "python"), f"{platform}: erhalten {got}"


def test_windows_path():
    """Unter Windows ist der Interpreter Scripts/python.exe"""
    got = main.env_python(Path(".venv"), "win32")
    assert got == Path(".venv", "Scripts", "python.exe"), f"win32: erhalten {got}"

Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.

Programm ausführen:

python main.py

Prüfungen ausführen (learnrun.py muss im selben Ordner liegen):

python learnrun.py test
learnrun.py herunterladen

Übung 2 von 2

Eine Umgebung aus Python anlegen

make_env(path) soll mit dem Modul venv eine virtuelle Umgebung unter path anlegen, ohne pip, damit es schnell geht, und den Pfad ihres Interpreters liefern. Der Starter berechnet nur den Pfad. Die Tests legen Umgebungen in temporären Ordnern an und starten den gelieferten Interpreter, um zu prüfen, dass er sys.prefix != sys.base_prefix meldet. Starten Sie es lokal: Es hinterlässt ein .venv im aktuellen Ordner.

Diese Übung braucht Python auf Ihrem Computer (die Browser-Version kann sie nicht ausführen). Dateien und Befehle stehen unten.

Hinweise
  1. Hinweis 1

    venv.create(path) tut, was python -m venv path auf der Kommandozeile tut.

  2. Hinweis 2

    Übergeben Sie with_pip=False: pip zu installieren dauert mehrere Sekunden, und die Tests brauchen es nicht.

  3. Hinweis 3

    Rufen Sie venv.create(path, with_pip=False) als erste Zeile von make_env auf, vor dem return.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

import sys
import venv
from pathlib import Path


def make_env(path: Path) -> Path:
    """Create a virtual environment at path and return its interpreter."""
    venv.create(path, with_pip=False)
    if sys.platform == "win32":
        return path / "Scripts" / "python.exe"
    return path / "bin" / "python"


if __name__ == "__main__":
    python = make_env(Path(".venv"))
    print("created:", python.exists())
    print("run it with:", python)
Auf dem eigenen Computer ausführen

Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.py

import sys
import venv
from pathlib import Path


def make_env(path: Path) -> Path:
    """Create a virtual environment at path and return its interpreter."""
    # Create the environment first, without pip, then return its interpreter.
    if sys.platform == "win32":
        return path / "Scripts" / "python.exe"
    return path / "bin" / "python"


if __name__ == "__main__":
    python = make_env(Path(".venv"))
    print("created:", python.exists())
    print("run it with:", python)

test_main.py

import subprocess
import tempfile
from pathlib import Path

import main


def test_creates_environment():
    """make_env schreibt pyvenv.cfg in den neuen Ordner"""
    with tempfile.TemporaryDirectory() as tmp:
        env = Path(tmp) / ".venv"
        main.make_env(env)
        assert (env / "pyvenv.cfg").exists(), "kein pyvenv.cfg: rufen Sie venv.create(path, with_pip=False) auf"


def test_returns_interpreter():
    """make_env liefert den Pfad des neuen Interpreters, und er existiert"""
    with tempfile.TemporaryDirectory() as tmp:
        python = main.make_env(Path(tmp) / ".venv")
        assert python.exists(), f"{python} existiert nicht"


def test_interpreter_is_in_the_venv():
    """Der gelieferte Interpreter meldet, dass er in einer virtuellen Umgebung läuft"""
    with tempfile.TemporaryDirectory() as tmp:
        python = main.make_env(Path(tmp) / ".venv")
        check = subprocess.run(
            [str(python), "-c", "import sys; print(sys.prefix != sys.base_prefix)"],
            capture_output=True,
            text=True,
        )
        assert check.stdout.strip() == "True", f"{python} gab {check.stdout.strip()!r} aus{check.stderr}"

Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.

Programm ausführen:

python main.py

Prüfungen ausführen (learnrun.py muss im selben Ordner liegen):

python learnrun.py test
learnrun.py herunterladen

Häufige Fehler

Einen Shell-Befehl in Python tippen

# Setting up the project
python -m venv .venv

Was Python ausgibt

SyntaxError: invalid syntax

Warum, und die Lösung

python -m venv .venv, source .venv/bin/activate und pip install sind Befehle für das Terminal (bash, zsh, PowerShell), kein Python-Code. In einer .py-Datei oder an der >>>-Eingabeaufforderung sind sie ein Syntaxfehler. Führen Sie sie in der Shell aus; aus Python heraus nutzen Sie das Modul venv oder subprocess.

Installiert, aber in ein anderes Python

import requests

print(requests.__version__)

Was Python ausgibt

ModuleNotFoundError: No module named 'requests'

Warum, und die Lösung

Sie haben requests installiert, aber in eine andere Umgebung als die des python, das diese Datei ausführt: Vielleicht gehörte pip zu einem anderen Python, oder die Umgebung war in diesem Terminal nicht aktiviert. Aktivieren Sie .venv, prüfen Sie mit python -c "import sys; print(sys.prefix)" und installieren Sie mit python -m pip install requests, damit pip und python derselbe Interpreter sind.

Eine falsch geschriebene Requirements-Datei

import subprocess
import sys

subprocess.run([sys.executable, "-m", "pip", "install", "-r", "requirments.txt"], check=True)

Was Python ausgibt

ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirments.txt'

Warum, und die Lösung

pip install -r liest die genannte Datei, relativ zum aktuellen Ordner, und bricht ab, wenn sie fehlt; hier fehlt in requirments.txt ein e. Prüfen Sie den Namen und starten Sie den Befehl im Projektordner. check=True macht aus dem Exit-Status ungleich null dann CalledProcessError, sodass ein Skript nicht weiterläuft, als hätte die Installation geklappt.

Python im Browser: Pyodide 314.0.7, MPL-2.0. Lizenz und Quellcode

Abschlussquiz

5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.

Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.

Problem melden

Etwas ist falsch oder unklar? Beschreiben Sie es kurz, dann wird es geprüft und korrigiert.

#

Mindestens 20 Zeichen.

Nur, wenn Sie eine Antwort wünschen.

Kernideen

Eine Umgebung pro Projekt

Eine virtuelle Umgebung ist ein Ordner mit eigenem Python-Interpreter und eigenem site-packages, sodass zwei Projekte verschiedene Versionen eines Pakets brauchen können, ohne sich zu stören. Legen Sie sie im Projektordner mit python -m venv .venv an; .venv ist der übliche Name. Darin enthält bin (unter Windows Scripts) den Interpreter und die activate-Skripte, und pyvenv.cfg hält fest, aus welchem Python sie gebaut wurde. Der Ordner ist wegwerfbar: Löschen Sie ihn und legen Sie ihn neu an, wenn er kaputtgeht.

Aktivieren ist eine Abkürzung

source .venv/bin/activate (Linux, macOS) oder .venv\Scripts\activate (Windows) setzt die Umgebung an den Anfang von PATH, sodass python und pip deren Kopien meinen; die Eingabeaufforderung zeigt (.venv), und deactivate macht es rückgängig. Aktivieren ist optional: .venv/bin/python app.py nutzt die Umgebung direkt. In einem Programm ist sys.prefix != sys.base_prefix genau dann True, wenn Python aus einer virtuellen Umgebung läuft.

pip und requirements.txt

python -m pip install requests installiert ein Paket aus dem Python Package Index in die Umgebung des python, das Sie gestartet haben; requests==2.32.3 legt eine Version fest. Nehmen Sie python -m pip statt eines bloßen pip: So kann nicht versehentlich ein anderes Python gemeint sein. python -m pip freeze > requirements.txt hält fest, was installiert ist, und python -m pip install -r requirements.txt installiert alles wieder. Committen Sie requirements.txt, nie .venv.

Quellen

Zuletzt geprüft am 29. September 2026