HOWTO · Python

Lesen Sie Umgebungsvariablen aus der Env-Datei in Python

Erfahren Sie, wie Sie lokale .env-Werte in Python mit python-dotenv laden oder sie aus einer Shell einlesen und exportieren, bevor Sie ein Skript starten.

Auf dieser Seite

Eine .env-Datei speichert Konfigurationswerte wie eine Dienst-URL oder ein Entwicklungsmodus-Kennzeichen. Python lädt diese Datei nicht automatisch. Für eine Anwendung ist python-dotenv die direkte Option; ein Shell-Skript ist nützlich, wenn Sie Werte laden und exportieren möchten, bevor Sie einen Python-Prozess starten.

Eine .env-Datei in Python mit python-dotenv lesen

Installieren Sie für eine Anwendung python-dotenv in derselben Python-Umgebung, die auch zur Ausführung verwendet wird, mit python -m pip install python-dotenv. Das folgende Beispiel erstellt eine temporäre .env-Datei mit dem Inhalt APP_MODE=development und übergibt genau diesen Dateipfad an load_dotenv(), bevor der Wert mit os.getenv() abgerufen wird. Übergeben Sie in Ihrer Anwendung den Pfad Ihrer Projektdatei .env an load_dotenv(); wenn sie neben dem Skript liegt, können Sie Path(__file__).with_name(".env") verwenden:

import os
from pathlib import Path
from tempfile import TemporaryDirectory

try:
    from dotenv import load_dotenv
except ImportError:
    print("Install python-dotenv to run this example.")
else:
    with TemporaryDirectory() as directory:
        env_path = Path(directory) / ".env"
        env_path.write_text("APP_MODE=development\n", encoding="utf-8")
        load_dotenv(env_path)
        print(os.getenv("APP_MODE"))

Laufzeitnachweise bestätigen, dass der erfolgreiche Ladefall development ausgegeben hat. Die bereitgestellten Laufzeitnachweise dokumentieren auch den Rückfall bei fehlender Abhängigkeit, der „Install python-dotenv to run this example.“ ausgegeben hat. Das Beispiel lädt die im Code erstellte temporäre Datei und nicht eine Projektdatei. Standardmäßig behält load_dotenv() einen APP_MODE-Wert bei, der bereits in der Prozessumgebung vorhanden ist, sodass development nur dann ausgegeben wird, wenn diese Variable nicht bereits gesetzt war. Übergeben Sie für eine Anwendung den Pfad der Projektdatei wie oben gezeigt explizit. Weitere Einzelheiten zur Paketverwendung finden Sie im python-dotenv-Leitfaden.

Das folgende eigenständige Beispiel mit der Standardbibliothek ist eine separate Alternative zum Lesen einer einfachen KEY=value-Datei ohne installiertes Paket:

import os
from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as directory:
    env_path = Path(directory) / ".env"
    env_path.write_text("APP_MODE=development\n", encoding="utf-8")
    for line in env_path.read_text(encoding="utf-8").splitlines():
        key, separator, value = line.partition("=")
        if separator:
            os.environ[key] = value
    print(os.getenv("APP_MODE"))
development

Dieser kleine Parser ist nur für einfache KEY=value-Zeilen gedacht; verwenden Sie python-dotenv, wenn Sie dessen .env-Parsing-Verhalten benötigen. Übergeben Sie in einer Anwendung einen Pfad wie dotenv_path=Path(__file__).with_name(".env") an load_dotenv(), wenn die Datei neben Ihrem Skript liegen soll. Halten Sie Geheimnisse aus der Versionsverwaltung heraus und beschränken Sie den Zugriff auf Dateien, die Anmeldedaten enthalten.

Eine .env-Datei vor dem Ausführen von Python laden

Eine Shell kann Werte ebenfalls laden und an einen Python-Kindprozess übergeben. Dies ist getrennt von der Aktivierung einer virtuellen Python-Umgebung zu betrachten: Das Einlesen (Sourcing) ändert die Variablen der Shell, während eine virtuelle Umgebung Python und die installierten Pakete auswählt.

Das folgende Bash-Beispiel erstellt seine eigenen Dateien, liest die Konfiguration ein, exportiert die Werte für den Kindprozess und führt Python aus:

set -eu
workdir=$(mktemp -d)
trap 'rm -rf "$workdir"' EXIT
cat > "$workdir/config.env" <<'ENV'
TYPE=prod
PORT=5000
ENV
cat > "$workdir/read_env.py" <<'PY'
import os

print(os.getenv("TYPE"))
print(os.getenv("PORT"))
PY
(
    cd "$workdir"
    set -a
    . ./config.env
    set +a
    python3 read_env.py
)
prod
5000

Hier markiert set -a Zuweisungen für den Export, . (die POSIX-Form von Bashs source) liest die Datei in die aktuelle Shell ein, und set +a schaltet den automatischen Export wieder aus. Beim Einlesen wird Shell-Syntax ausgeführt, lesen Sie daher nur Dateien ein, denen Sie vertrauen. Eine für python-dotenv vorgesehene .env-Datei kann Syntax enthalten, die keine gültige Shell-Syntax ist; halten Sie die Shell-Konfiguration einfach und mit der von Ihnen verwendeten Shell kompatibel.

Wenn ein Wert fehlt, prüfen Sie, ob der Pfad auf die vorgesehene Datei zeigt, ob die Schreibweise des Schlüssels an beiden Stellen übereinstimmt und ob die Datei geladen wird, bevor Python startet. Allein dadurch, dass eine Datei neben einem Skript liegt, gelangen ihre Werte noch nicht in die Prozessumgebung.

Das Shell-Skript unter Windows ausführen

Führen Sie unter Windows den Bash-Ablauf über WSL oder Git Bash aus. WSL stellt eine Linux-Distribution wie Ubuntu bereit; Git Bash ist auf der Git-Downloadseite verfügbar. Verwenden Sie in WSL cd, um in das Verzeichnis zu wechseln, das run.sh enthält; wählen Sie in Git Bash dort Git Bash Here oder verwenden Sie cd. Führen Sie dann ./run.sh aus. Das Skript erstellt config.env und read_env.py in einem temporären Verzeichnis und entfernt sie beim Beenden wieder, sodass Sie diese Dateien nicht neben run.sh ablegen müssen.

Speichern Sie run.sh mit Unix-Zeilenenden (LF), damit Bash die Datei wie erwartet lesen kann.

Fazit

Verwenden Sie python-dotenv, um eine lokale .env-Datei innerhalb einer Python-Anwendung zu laden, oder verwenden Sie Bash, um shellkompatible Werte einzulesen und zu exportieren, bevor Sie Python starten. Prüfen Sie zuerst den Dateipfad und die Variablennamen, wenn ein Wert nicht verfügbar ist, und denken Sie daran, dass beim Einlesen die Datei als Shell-Code ausgeführt wird.