Zum Inhalt springen

Virtuelle Umgebungen

Wenn Sie an Python-Projekten arbeiten, sollten Sie wahrscheinlich eine virtuelle Umgebung (oder einen ähnlichen Mechanismus) verwenden, um die für jedes Projekt installierten Pakete zu isolieren.

Info

Wenn Sie bereits mit virtuellen Umgebungen vertraut sind und wissen, wie man sie erstellt und verwendet, können Sie diesen Abschnitt überspringen. 🤓

Tipp

Eine virtuelle Umgebung ist etwas anderes als eine Umgebungsvariable.

Eine Umgebungsvariable ist eine Variable im System, die von Programmen verwendet werden kann.

Eine virtuelle Umgebung ist ein Verzeichnis mit einigen Dateien darin.

Info

Diese Seite erklärt Ihnen, wie Sie virtuelle Umgebungen verwenden und wie sie funktionieren.

Wenn Sie bereit sind, ein Tool zu verwenden, das alles für Sie verwaltet (einschließlich der Installation von Python), probieren Sie uv.

Projekt erstellen

Erstellen Sie zuerst ein Verzeichnis für Ihr Projekt.

Normalerweise erstelle ich ein Verzeichnis namens code in meinem Home-/Benutzerverzeichnis.

Und darin erstelle ich ein Verzeichnis pro Projekt.

// Go to the home directory
$ cd
// Create a directory for all your code projects
$ mkdir code
// Enter into that code directory
$ cd code
// Create a directory for this project
$ mkdir awesome-project
// Enter into that project directory
$ cd awesome-project

Virtuelle Umgebung erstellen

Wenn Sie zum ersten Mal an einem Python-Projekt arbeiten, erstellen Sie eine virtuelle Umgebung innerhalb Ihres Projekts.

Tipp

Dies müssen Sie nur einmal pro Projekt tun, nicht jedes Mal, wenn Sie arbeiten.

Um eine virtuelle Umgebung zu erstellen, können Sie das Modul venv verwenden, das mit Python geliefert wird.

$ python -m venv .venv
Was bedeutet dieser Befehl?
  • python: Verwenden Sie das Programm namens python
  • -m: Rufen Sie ein Modul als Skript auf, wir geben als nächstes an, welches Modul
  • venv: Verwenden Sie das Modul namens venv, das normalerweise mit Python installiert ist
  • .venv: Erstellen Sie die virtuelle Umgebung im neuen Verzeichnis .venv

Wenn Sie uv installiert haben, können Sie es zum Erstellen einer virtuellen Umgebung verwenden.

$ uv venv

Tipp

Standardmäßig erstellt uv eine virtuelle Umgebung in einem Verzeichnis namens .venv.

Sie könnten es jedoch anpassen, indem Sie ein zusätzliches Argument mit dem Verzeichnisnamen übergeben.

Dieser Befehl erstellt eine neue virtuelle Umgebung in einem Verzeichnis namens .venv.

.venv oder ein anderer Name

Sie könnten die virtuelle Umgebung in einem anderen Verzeichnis erstellen, aber es ist üblich, sie .venv zu nennen.

Virtuelle Umgebung aktivieren

Aktivieren Sie die neue virtuelle Umgebung, damit alle Python-Befehle, die Sie ausführen, oder Pakete, die Sie installieren, diese verwenden.

Tipp

Tun Sie dies jedes Mal, wenn Sie eine neue Terminalsitzung beginnen, um an dem Projekt zu arbeiten.

$ source .venv/bin/activate
$ .venv\Scripts\Activate.ps1

Oder wenn Sie Bash für Windows verwenden (z. B. Git Bash)

$ source .venv/Scripts/activate

Tipp

Jedes Mal, wenn Sie ein neues Paket in dieser Umgebung installieren, aktivieren Sie die Umgebung erneut.

Dies stellt sicher, dass Sie, wenn Sie ein Terminal-Programm (CLI) verwenden, das von diesem Paket installiert wurde, dasjenige aus Ihrer virtuellen Umgebung verwenden und nicht irgendeines anderes, das global installiert sein könnte, wahrscheinlich mit einer anderen Version als der, die Sie benötigen.

Prüfen, ob die virtuelle Umgebung aktiv ist

Prüfen Sie, ob die virtuelle Umgebung aktiv ist (der vorherige Befehl hat funktioniert).

Tipp

Dies ist optional, aber es ist eine gute Möglichkeit, zu überprüfen, ob alles wie erwartet funktioniert und Sie die beabsichtigte virtuelle Umgebung verwenden.

$ which python

/home/user/code/awesome-project/.venv/bin/python

Wenn die python-Binärdatei unter .venv/bin/python in Ihrem Projekt (in diesem Fall awesome-project) angezeigt wird, dann hat es funktioniert. 🎉

$ Get-Command python

C:\Users\user\code\awesome-project\.venv\Scripts\python

Wenn die python-Binärdatei unter .venv\Scripts\python in Ihrem Projekt (in diesem Fall awesome-project) angezeigt wird, dann hat es funktioniert. 🎉

pip aktualisieren

Tipp

Wenn Sie uv verwenden, würden Sie es zum Installieren von Dingen anstelle von pip verwenden, sodass Sie pip nicht aktualisieren müssen. 😎

Wenn Sie pip zum Installieren von Paketen verwenden (es wird standardmäßig mit Python geliefert), sollten Sie es auf die neueste Version aktualisieren.

Viele exotische Fehler bei der Installation eines Pakets werden durch einfaches Aktualisieren von pip zuerst behoben.

Tipp

Dies würden Sie normalerweise einmal tun, direkt nachdem Sie die virtuelle Umgebung erstellt haben.

Stellen Sie sicher, dass die virtuelle Umgebung aktiv ist (mit dem obigen Befehl) und führen Sie dann aus

$ python -m pip install --upgrade pip

---> 100%

.gitignore hinzufügen

Wenn Sie Git verwenden (sollten Sie), fügen Sie eine .gitignore-Datei hinzu, um alles in Ihrem .venv von Git auszuschließen.

Tipp

Wenn Sie uv zum Erstellen der virtuellen Umgebung verwendet haben, hat es dies bereits für Sie erledigt, Sie können diesen Schritt überspringen. 😎

Tipp

Tun Sie dies einmal, direkt nachdem Sie die virtuelle Umgebung erstellt haben.

$ echo "*" > .venv/.gitignore
Was bedeutet dieser Befehl?
  • echo "*": gibt den Text * im Terminal aus (der nächste Teil ändert das ein wenig)
  • >: alles, was vom Befehl links von > zum Terminal ausgegeben wird, sollte nicht gedruckt, sondern in die Datei geschrieben werden, die rechts von > steht
  • .gitignore: der Name der Datei, in die der Text geschrieben werden soll

Und * bedeutet für Git "alles". Also wird alles im Verzeichnis .venv ignoriert.

Dieser Befehl erstellt eine Datei .gitignore mit dem Inhalt

*

Pakete installieren

Nachdem Sie die Umgebung aktiviert haben, können Sie Pakete darin installieren.

Tipp

Tun Sie dies einmal, wenn Sie die benötigten Pakete für Ihr Projekt installieren oder aktualisieren.

Wenn Sie eine Version aktualisieren oder ein neues Paket hinzufügen müssen, würden Sie dies erneut tun.

Pakete direkt installieren

Wenn Sie es eilig haben und keine Datei verwenden möchten, um die Paketabhängigkeiten Ihres Projekts zu deklarieren, können Sie sie direkt installieren.

Tipp

Es ist eine (sehr) gute Idee, die Pakete und Versionen, die Ihr Programm benötigt, in eine Datei zu schreiben (z. B. requirements.txt oder pyproject.toml).

$ pip install sqlmodel

---> 100%

Wenn Sie uv haben

$ uv pip install sqlmodel
---> 100%

Installation aus requirements.txt

Wenn Sie eine requirements.txt haben, können Sie diese jetzt verwenden, um ihre Pakete zu installieren.

$ pip install -r requirements.txt
---> 100%

Wenn Sie uv haben

$ uv pip install -r requirements.txt
---> 100%
requirements.txt

Eine requirements.txt mit einigen Paketen könnte so aussehen:

sqlmodel==0.13.0
rich==13.7.1

Programm ausführen

Nachdem Sie die virtuelle Umgebung aktiviert haben, können Sie Ihr Programm ausführen, und es wird das Python in Ihrer virtuellen Umgebung mit den dort installierten Paketen verwenden.

$ python main.py

Hello World

Editor konfigurieren

Sie werden wahrscheinlich einen Editor verwenden, stellen Sie sicher, dass Sie ihn so konfigurieren, dass er dieselbe virtuelle Umgebung verwendet, die Sie erstellt haben (er wird sie wahrscheinlich automatisch erkennen), damit Sie Autovervollständigung und Inline-Fehler erhalten können.

Zum Beispiel

Tipp

Dies müssen Sie normalerweise nur einmal tun, wenn Sie die virtuelle Umgebung erstellen.

Virtuelle Umgebung deaktivieren

Sobald Sie mit der Arbeit an Ihrem Projekt fertig sind, können Sie die virtuelle Umgebung deaktivieren.

$ deactivate

Auf diese Weise wird beim Ausführen von python nicht versucht, es aus dieser virtuellen Umgebung mit den dort installierten Paketen auszuführen.

Bereit zur Arbeit

Jetzt sind Sie bereit, mit Ihrem Projekt zu beginnen.

Tipp

Möchten Sie verstehen, was das alles bedeutet?

Lesen Sie weiter. 👇🤓

Warum virtuelle Umgebungen?

Um mit SQLModel zu arbeiten, müssen Sie Python installieren.

Danach müssten Sie SQLModel und alle anderen Pakete, die Sie verwenden möchten, installieren.

Zur Installation von Paketen würden Sie normalerweise den Befehl pip verwenden, der mit Python geliefert wird (oder ähnliche Alternativen).

Wenn Sie jedoch nur pip direkt verwenden, werden die Pakete in Ihrer globalen Python-Umgebung (der globalen Python-Installation) installiert.

Das Problem

Was ist also das Problem mit der Installation von Paketen in der globalen Python-Umgebung?

Irgendwann werden Sie wahrscheinlich viele verschiedene Programme schreiben, die von unterschiedlichen Paketen abhängen. Und einige dieser Projekte, an denen Sie arbeiten, werden von unterschiedlichen Versionen desselben Pakets abhängen. 😱

Zum Beispiel könnten Sie ein Projekt namens philosophers-stone erstellen, dieses Programm hängt von einem anderen Paket namens harry, Version 1, ab. Also müssen Sie harry installieren.

flowchart LR
    stone(philosophers-stone) -->|requires| harry-1[harry v1]

Dann, später, erstellen Sie ein weiteres Projekt namens prisoner-of-azkaban, und dieses Projekt hängt ebenfalls von harry ab, aber dieses Projekt benötigt harry Version 3.

flowchart LR
    azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3]

Aber das Problem ist jetzt, wenn Sie die Pakete global (in der globalen Umgebung) anstelle einer lokalen virtuellen Umgebung installieren, müssen Sie wählen, welche Version von harry Sie installieren möchten.

Wenn Sie philosophers-stone ausführen möchten, müssen Sie zuerst harry Version 1 installieren, zum Beispiel mit

$ pip install "harry==1"

Und dann hätten Sie harry Version 1 in Ihrer globalen Python-Umgebung installiert.

flowchart LR
    subgraph global[global env]
        harry-1[harry v1]
    end
    subgraph stone-project[philosophers-stone project]
        stone(philosophers-stone) -->|requires| harry-1
    end

Aber wenn Sie dann prisoner-of-azkaban ausführen möchten, müssen Sie harry Version 1 deinstallieren und harry Version 3 installieren (oder die Installation von Version 3 würde Version 1 automatisch deinstallieren).

$ pip install "harry==3"

Und dann hätten Sie harry Version 3 in Ihrer globalen Python-Umgebung installiert.

Und wenn Sie versuchen, philosophers-stone erneut auszuführen, besteht die Möglichkeit, dass es nicht funktioniert, da es harry Version 1 benötigt.

flowchart LR
    subgraph global[global env]
        harry-1[<strike>harry v1</strike>]
        style harry-1 fill:#ccc,stroke-dasharray: 5 5
        harry-3[harry v3]
    end
    subgraph stone-project[philosophers-stone project]
        stone(philosophers-stone) -.-x|⛔️| harry-1
    end
    subgraph azkaban-project[prisoner-of-azkaban project]
        azkaban(prisoner-of-azkaban) --> |requires| harry-3
    end

Tipp

Es ist sehr üblich, dass Python-Pakete versuchen, breaking changes in neuen Versionen zu vermeiden, aber es ist besser, auf Nummer sicher zu gehen, neuere Versionen absichtlich zu installieren und dann Tests auszuführen, um zu überprüfen, ob alles korrekt funktioniert.

Stellen Sie sich nun vor, dass mit vielen anderen Paketen, von denen alle Ihre Projekte abhängen. Das ist sehr schwer zu verwalten. Und Sie würden wahrscheinlich einige Projekte mit einigen inkompatiblen Versionen der Pakete ausführen und nicht wissen, warum etwas nicht funktioniert.

Auch, je nach Betriebssystem (z. B. Linux, Windows, macOS), wurde Python möglicherweise bereits vorinstalliert. Und in diesem Fall hatte es wahrscheinlich einige Pakete mit bestimmten Versionen vorinstalliert, die von Ihrem System benötigt werden. Wenn Sie Pakete in der globalen Python-Umgebung installieren, könnten Sie versehentlich einige der Programme beschädigen, die mit Ihrem Betriebssystem geliefert wurden.

Wo werden Pakete installiert?

Wenn Sie Python installieren, erstellt es einige Verzeichnisse mit einigen Dateien auf Ihrem Computer.

Einige dieser Verzeichnisse sind dafür verantwortlich, alle von Ihnen installierten Pakete zu speichern.

Wenn Sie ausführen

// Don't run this now, it's just an example 🤓
$ pip install sqlmodel
---> 100%

Dies lädt eine komprimierte Datei mit dem SQLModel-Code herunter, normalerweise von PyPI.

Es wird auch Dateien für andere Pakete herunterladen, von denen SQLModel abhängt.

Dann werden all diese Dateien extrahiert und in einem Verzeichnis auf Ihrem Computer abgelegt.

Standardmäßig werden diese heruntergeladenen und extrahierten Dateien in das Verzeichnis gelegt, das mit Ihrer Python-Installation geliefert wird, das ist die globale Umgebung.

Was sind virtuelle Umgebungen?

Die Lösung für die Probleme, alle Pakete in der globalen Umgebung zu haben, ist die Verwendung einer virtuellen Umgebung für jedes Projekt, an dem Sie arbeiten.

Eine virtuelle Umgebung ist ein Verzeichnis, sehr ähnlich dem globalen, in dem Sie die Pakete für ein Projekt installieren können.

Auf diese Weise hat jedes Projekt seine eigene virtuelle Umgebung (.venv-Verzeichnis) mit seinen eigenen Paketen.

flowchart TB
    subgraph stone-project[philosophers-stone project]
        stone(philosophers-stone) --->|requires| harry-1
        subgraph venv1[.venv]
            harry-1[harry v1]
        end
    end
    subgraph azkaban-project[prisoner-of-azkaban project]
        azkaban(prisoner-of-azkaban) --->|requires| harry-3
        subgraph venv2[.venv]
            harry-3[harry v3]
        end
    end
    stone-project ~~~ azkaban-project

Was bedeutet die Aktivierung einer virtuellen Umgebung?

Wenn Sie eine virtuelle Umgebung aktivieren, zum Beispiel mit

$ source .venv/bin/activate
$ .venv\Scripts\Activate.ps1

Oder wenn Sie Bash für Windows verwenden (z. B. Git Bash)

$ source .venv/Scripts/activate

Dieser Befehl erstellt oder ändert einige Umgebungsvariablen, die für die nächsten Befehle verfügbar sein werden.

Eine dieser Variablen ist die PATH-Variable.

Tipp

Mehr über die PATH-Umgebungsvariable erfahren Sie im Abschnitt Umgebungsvariablen.

Die Aktivierung einer virtuellen Umgebung fügt ihren Pfad .venv/bin (unter Linux und macOS) oder .venv\Scripts (unter Windows) zur PATH-Umgebungsvariable hinzu.

Nehmen wir an, vor der Aktivierung der Umgebung sah die PATH-Variable so aus

/usr/bin:/bin:/usr/sbin:/sbin

Das bedeutet, dass das System nach Programmen suchen würde in

  • /usr/bin
  • /bin
  • /usr/sbin
  • /sbin
C:\Windows\System32

Das bedeutet, dass das System nach Programmen suchen würde in

  • C:\Windows\System32

Nach der Aktivierung der virtuellen Umgebung würde die PATH-Variable etwa so aussehen

/home/user/code/awesome-project/.venv/bin:/usr/bin:/bin:/usr/sbin:/sbin

Das bedeutet, dass das System nun zuerst nach Programmen suchen wird in

/home/user/code/awesome-project/.venv/bin

bevor es in den anderen Verzeichnissen sucht.

Wenn Sie also python im Terminal eingeben, findet das System das Python-Programm in

/home/user/code/awesome-project/.venv/bin/python

und verwendet dieses.

C:\Users\user\code\awesome-project\.venv\Scripts;C:\Windows\System32

Das bedeutet, dass das System nun zuerst nach Programmen suchen wird in

C:\Users\user\code\awesome-project\.venv\Scripts

bevor es in den anderen Verzeichnissen sucht.

Wenn Sie also python im Terminal eingeben, findet das System das Python-Programm in

C:\Users\user\code\awesome-project\.venv\Scripts\python

und verwendet dieses.

Eine wichtige Einzelheit ist, dass der Pfad der virtuellen Umgebung am Anfang der PATH-Variable eingefügt wird. Das System findet ihn bevor es irgendein anderes verfügbares Python findet. Auf diese Weise wird, wenn Sie python ausführen, das Python aus der virtuellen Umgebung anstelle eines anderen python (z. B. eines python aus einer globalen Umgebung) verwendet.

Die Aktivierung einer virtuellen Umgebung ändert auch einige andere Dinge, aber dies ist eine der wichtigsten Dinge, die sie tut.

Eine virtuelle Umgebung prüfen

Wenn Sie prüfen, ob eine virtuelle Umgebung aktiv ist, zum Beispiel mit

$ which python

/home/user/code/awesome-project/.venv/bin/python
$ Get-Command python

C:\Users\user\code\awesome-project\.venv\Scripts\python

Das bedeutet, dass das python-Programm, das verwendet wird, dasjenige ist, das sich in der virtuellen Umgebung befindet.

Sie verwenden which unter Linux und macOS und Get-Command unter Windows PowerShell.

Dieser Befehl funktioniert so, dass er die PATH-Umgebungsvariable durchgeht, jeden Pfad der Reihe nach prüft und nach dem Programm namens python sucht. Sobald er es findet, zeigt er Ihnen den Pfad zu diesem Programm an.

Der wichtigste Teil ist, dass, wenn Sie python aufrufen, genau dieses "python" ausgeführt wird.

Sie können also bestätigen, ob Sie sich in der richtigen virtuellen Umgebung befinden.

Tipp

Es ist einfach, eine virtuelle Umgebung zu aktivieren, ein Python zu bekommen und dann zu einem anderen Projekt zu wechseln.

Und das zweite Projekt wird nicht funktionieren, weil Sie das falsche Python aus einer virtuellen Umgebung für ein anderes Projekt verwenden.

Es ist nützlich, überprüfen zu können, welches python verwendet wird. 🤓

Warum eine virtuelle Umgebung deaktivieren?

Sie könnten zum Beispiel an einem Projekt philosophers-stone arbeiten, diese virtuelle Umgebung aktivieren, Pakete installieren und mit dieser Umgebung arbeiten.

Und dann möchten Sie an einem anderen Projekt prisoner-of-azkaban arbeiten.

Sie wechseln zu diesem Projekt

$ cd ~/code/prisoner-of-azkaban

Wenn Sie die virtuelle Umgebung für philosophers-stone nicht deaktivieren, wird beim Ausführen von python im Terminal versucht, das Python von philosophers-stone zu verwenden.

$ cd ~/code/prisoner-of-azkaban

$ python main.py

// Error importing sirius, it's not installed 😱
Traceback (most recent call last):
    File "main.py", line 1, in <module>
        import sirius

Aber wenn Sie die virtuelle Umgebung deaktivieren und die neue für prisoner-of-askaban aktivieren, wird beim Ausführen von python das Python aus der virtuellen Umgebung in prisoner-of-azkaban verwendet.

$ cd ~/code/prisoner-of-azkaban

// You don't need to be in the old directory to deactivate, you can do it wherever you are, even after going to the other project 😎
$ deactivate

// Activate the virtual environment in prisoner-of-azkaban/.venv 🚀
$ source .venv/bin/activate

// Now when you run python, it will find the package sirius installed in this virtual environment ✨
$ python main.py

I solemnly swear 🐺

Alternativen

Dies ist eine einfache Anleitung, um Ihnen den Einstieg zu erleichtern und Ihnen zu erklären, wie alles unter der Haube funktioniert.

Es gibt viele Alternativen zur Verwaltung von virtuellen Umgebungen, Paketabhängigkeiten (Anforderungen), Projekten.

Wenn Sie bereit sind und ein Tool verwenden möchten, um das gesamte Projekt, Paketabhängigkeiten, virtuelle Umgebungen usw. zu verwalten, empfehle ich Ihnen, uv auszuprobieren.

uv kann viele Dinge tun, es kann

  • Python installieren für Sie, auch verschiedene Versionen
  • Die virtuelle Umgebung für Ihre Projekte verwalten
  • Pakete installieren
  • Paketabhängigkeiten und Versionen für Ihr Projekt verwalten
  • Sicherstellen, dass Sie einen exakten Satz von Paketen und Versionen zur Installation haben, einschließlich ihrer Abhängigkeiten, damit Sie sicher sein können, dass Sie Ihr Projekt in der Produktion genauso ausführen können wie auf Ihrem Computer während der Entwicklung. Dies wird als Locking bezeichnet.
  • Und viele andere Dinge

Fazit

Wenn Sie das alles gelesen und verstanden haben, dann wissen Sie jetzt viel mehr über virtuelle Umgebungen als viele Entwickler da draußen. 🤓

Dieses Detailwissen wird wahrscheinlich nützlich sein, wenn Sie in Zukunft etwas debuggen, das komplex erscheint, aber Sie werden wissen, wie alles unter der Haube funktioniert. 😎