Python Entwicklungsumgebung unter Linux einrichten – pyenv, venv und pip
Python unter Linux einzurichten klingt einfach – ist es aber nicht, wenn man es richtig macht. Das Problem: Linux-Distributionen liefern Python als Systemkomponente. Installierst du Pakete global mit sudo pip install, riskierst du Systeminstabilitäten oder Versionskonflikte zwischen Projekten.
Die Lösung: pyenv für saubere Python-Versionsverwaltung und venv für isolierte Projekt-Umgebungen.
Das Problem mit System-Python
# System-Python zeigt Ubuntu/Debian-Version
python3 --version
# Python 3.12.3 ← fixe Version, vom Paketmanager kontrolliert
# Pakete hier zu installieren ist gefährlich:
sudo pip install requests # FALSCH – kann Systemkomponenten beschädigen
Warum das problematisch ist:
- Unterschiedliche Projekte brauchen unterschiedliche Python-Versionen oder Paketversionen
sudo pipkann Systemtools überschreiben, die die Distro benötigt- Es gibt keine Trennung zwischen Projekten → "works on my machine"-Probleme
Die richtige Strategie:
System-Python → unangetastet (nie sudo pip!)
pyenv → mehrere Python-Versionen parallel installieren
venv → pro Projekt isolierte Umgebung
pip → nur innerhalb der venv
pyenv installieren und einrichten
pyenv baut Python aus dem Quellcode. Dafür werden Build-Abhängigkeiten benötigt.
Build-Abhängigkeiten installieren
# Ubuntu / Debian
sudo apt update
sudo apt install -y \
make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl git \
libncursesw5-dev xz-utils tk-dev libxml2-dev \
libxmlsec1-dev libffi-dev liblzma-dev
# Fedora
sudo dnf install -y \
make gcc zlib-devel bzip2-devel readline-devel sqlite-devel \
openssl-devel xz-devel libffi-devel findutils tk-devel
pyenv installieren
# Automatischer Installer (empfohlen)
curl https://pyenv.run | bash
Der Installer installiert pyenv und nützliche Plugins nach ~/.pyenv.
Shell konfigurieren
Füge folgendes in ~/.bashrc (bash) oder ~/.zshrc (zsh) ein:
# pyenv Shell-Integration
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init - bash)" # für zsh: eval "$(pyenv init - zsh)"
Änderungen übernehmen:
source ~/.bashrc
# oder neues Terminal öffnen
# Installation prüfen
pyenv --version
# pyenv 2.5.x
Python-Versionen mit pyenv verwalten
Verfügbare Versionen anzeigen
# Alle verfügbaren Python-Versionen
pyenv install --list
# Nur CPython 3.x Versionen filtern
pyenv install --list | grep "^\s*3\."
# Aktuelle stabile Versionen (2026):
# 3.12.x – Stable, LTS
# 3.13.x – Neueste (released Oktober 2024)
# 3.11.x – Ältere LTS, noch verbreitet
Python installieren
# Aktuelle stabile Version (z.B. 3.13.2)
pyenv install 3.13.2
# Ältere Version für Legacy-Projekte
pyenv install 3.11.9
# Fortschritt: dauert einige Minuten (Kompilierung aus Quellcode)
Versionen setzen
# Systemweit (für alle neuen Terminals)
pyenv global 3.13.2
# Nur für aktuelles Verzeichnis (.python-version Datei wird erstellt)
pyenv local 3.12.8
# Nur für aktuelle Shell-Session
pyenv shell 3.11.9
# Aktive Version prüfen
python --version
pyenv version
# 3.13.2 (set by /home/andre/.pyenv/version)
# Alle installierten Versionen
pyenv versions
# system
# * 3.13.2 (set by /home/andre/.pyenv/version)
# 3.12.8
# 3.11.9
.python-version im Projekt
cd mein-projekt
pyenv local 3.12.8
cat .python-version
# 3.12.8
# Diese Datei ins Repository committen!
# Jeder Mitentwickler bekommt automatisch die richtige Version
Virtuelle Umgebungen mit venv
Auch mit der richtigen Python-Version solltest du pro Projekt eine virtuelle Umgebung anlegen. Sie isoliert alle installierten Pakete.
venv erstellen und aktivieren
# Im Projektverzeichnis
cd mein-projekt
# Virtuelle Umgebung erstellen
python -m venv .venv
# Aktivieren
source .venv/bin/activate
# Prompt ändert sich:
# (.venv) andre@laptop:~/mein-projekt$
# Python-Pfad prüfen (muss auf .venv zeigen)
which python
# /home/andre/mein-projekt/.venv/bin/python
python --version
# Python 3.12.8
venv deaktivieren
deactivate
.venv in .gitignore aufnehmen
echo ".venv/" >> .gitignore
Wichtig: Virtuelle Umgebungen werden nicht ins Repository committet. Stattdessen dokumentierst du die Abhängigkeiten in
requirements.txt.
pip: Pakete installieren und verwalten
Immer innerhalb der aktivierten venv arbeiten!
Pakete installieren
# Aktivierte venv prüfen
which pip
# /home/andre/mein-projekt/.venv/bin/pip
# Paket installieren
pip install requests
# Spezifische Version
pip install requests==2.31.0
# Mindestversion
pip install "requests>=2.28.0"
# Paket aktualisieren
pip install --upgrade requests
# Paket deinstallieren
pip uninstall requests
requirements.txt – Abhängigkeiten dokumentieren
# Alle installierten Pakete in Datei schreiben
pip freeze > requirements.txt
cat requirements.txt
# certifi==2024.2.2
# charset-normalizer==3.3.2
# idna==3.6
# requests==2.31.0
# urllib3==2.2.1
# Aus requirements.txt installieren (für neue Entwickler/Server)
pip install -r requirements.txt
Unterschied: requirements.txt vs. pyproject.toml
requirements.txt → einfach, weit verbreitet, pinned Versionen
pyproject.toml → moderner Standard (PEP 517/518), für Packages und Tools
Für einfache Projekte reicht requirements.txt. Für Bibliotheken/Packages: pyproject.toml.
pip aktuell halten
# pip selbst aktualisieren
pip install --upgrade pip
Projektstruktur und Best Practices
Empfohlene Projektstruktur
mein-projekt/
├── .python-version ← pyenv-Versionsdatei
├── .gitignore
├── README.md
├── requirements.txt ← Abhängigkeiten (für Anwendungen)
├── requirements-dev.txt ← Entwicklungs-Abhängigkeiten
├── src/
│ └── mein_paket/
│ ├── __init__.py
│ └── main.py
└── tests/
└── test_main.py
requirements-dev.txt für Entwicklungstools
# Entwicklungstools separat halten
pip install pytest black ruff mypy
pip freeze > requirements-dev.txt
# Produktions-Abhängigkeiten
pip install requests fastapi
pip freeze > requirements.txt
Automatisches venv mit direnv (Optional)
direnv aktiviert die venv automatisch, wenn du das Verzeichnis betrittst:
sudo apt install direnv
# In ~/.bashrc hinzufügen:
eval "$(direnv hook bash)"
# Im Projekt:
echo "source .venv/bin/activate" > .envrc
direnv allow
.env-Datei für Geheimnisse
# .env (nie committen!)
DATABASE_URL=postgresql://user:pass@localhost/db
SECRET_KEY=dein-geheimer-schluessel
DEBUG=True
# In Python laden
pip install python-dotenv
# In Code:
from dotenv import load_dotenv
import os
load_dotenv()
db_url = os.getenv("DATABASE_URL")
uv: moderner, schneller Ersatz
uv ist ein modernes Tool (geschrieben in Rust), das pyenv + pip + venv in einem Tool vereint – und deutlich schneller ist.
# Installation
curl -LsSf https://astral.sh/uv/install.sh | sh
# Python installieren
uv python install 3.13
# Projekt initialisieren
uv init mein-projekt
cd mein-projekt
# Paket hinzufügen
uv add requests fastapi
# Ausführen (venv wird automatisch verwaltet)
uv run python src/main.py
# Skript mit Abhängigkeiten ausführen
uv run --with requests python script.py
Wann uv statt pyenv+pip?
- Neue Projekte ohne Legacy-Anforderungen: uv
- Bestehende Projekte mit requirements.txt: pyenv + pip bleibt einfacher
- Teams mit gemischten Tools: pyenv ist verbreiteter, besser dokumentiert
Häufige Probleme
python: command not found nach pyenv-Installation
# Shell-Integration prüfen
echo $PYENV_ROOT
# /home/andre/.pyenv
# PATH prüfen
echo $PATH | tr ':' '\n' | grep pyenv
# Falls nicht vorhanden: ~/.bashrc nochmal prüfen und neue Shell öffnen
source ~/.bashrc
ModuleNotFoundError: No module named 'xyz'
# Prüfen ob venv aktiviert ist
which python
# Muss auf .venv zeigen, nicht /usr/bin/python
# venv aktivieren
source .venv/bin/activate
pip install xyz
pyenv install schlägt fehl (Build-Fehler)
# Typischer Fehler: fehlende Build-Abhängigkeiten
# Abhängigkeiten prüfen und nachinstallieren
sudo apt install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev
# Dann erneut versuchen
pyenv install 3.13.2
pip install schlägt fehl: "externally managed environment"
Passiert wenn du versuchst, ohne aktivierte venv zu installieren (PEP 668, Ubuntu 23.04+):
error: externally-managed-environment
# Lösung: venv aktivieren!
source .venv/bin/activate
pip install paket
# NICHT: pip install --break-system-packages (riskant)
Rollback: pyenv entfernen
# pyenv deaktivieren und entfernen
rm -rf ~/.pyenv
# Shell-Konfiguration bereinigen
# ~/.bashrc: die drei pyenv-Zeilen entfernen
nano ~/.bashrc # PYENV_ROOT, PATH und eval-Zeilen löschen
source ~/.bashrc
Fazit
Eine saubere Python-Entwicklungsumgebung auf Linux sieht so aus:
# Einmalig (pro Rechner)
curl https://pyenv.run | bash # pyenv installieren
pyenv install 3.13.2 # Python installieren
# Pro Projekt
cd mein-projekt
pyenv local 3.13.2 # Python-Version pinnen
python -m venv .venv # venv erstellen
source .venv/bin/activate # venv aktivieren
pip install -r requirements.txt # Abhängigkeiten installieren