$ pip install -r requirements.txt

$ pip install -r requirements.txt

Wer jemals versucht hat, ein fremdes Skript von GitHub zu starten und dabei in einer Endlosschleife aus Fehlermeldungen gelandet ist, kennt den Frust. Man fängt an, händisch Pakete nachzuinstallieren, nur um festzustellen, dass die Version von Pandas nicht mit der Version von NumPy harmoniert. Es ist ein Albtraum. In der professionellen Softwareentwicklung ist Reproduzierbarkeit kein Luxus, sondern die Basis für alles, was wir tun. Ich habe Projekte gesehen, die Wochen an Zeit gekostet haben, nur weil die lokale Umgebung des Entwicklers nicht mit dem Server übereinstimmte. Die Lösung für dieses spezifische Problem ist eigentlich simpel, doch die Teufel stecken im Detail der Umsetzung. Wenn du deinen Workflow im Griff haben willst, ist der Befehl $ pip install -r requirements.txt dein wichtigstes Werkzeug, um eine exakte Kopie einer funktionierenden Abhängigkeitsliste in deine Umgebung zu ziehen. Ohne diese klare Definition der benötigten Bibliotheken baust du auf Sand.

Das Problem mit den Abhängigkeiten in Python

Python ist großartig, weil es für fast jedes Problem eine Bibliothek gibt. Das ist gleichzeitig sein größter Fluch. Jedes Paket, das du installierst, bringt eigene Unterabhängigkeiten mit sich. Das führt schnell zu einem dichten Wald aus Softwarekomponenten, den man kaum noch überblickt. Stell dir vor, du arbeitest an einer Datenanalyse. Du nutzt Scikit-learn in Version 1.2. Später kommt ein Kollege dazu, der bereits Version 1.5 auf seinem Rechner hat. Plötzlich ändern sich die Ergebnisse deiner Berechnungen oder der Code bricht komplett ab.

Hier setzt die Idee der Anforderungsdatei an. Es handelt sich im Kern um eine einfache Textdatei. Dort stehen alle Namen der Pakete drin, die dein Projekt zum Überleben braucht. Aber einfach nur den Namen reinzuschreiben, reicht oft nicht aus. Wir brauchen Präzision. Wir brauchen Versionierung. Wenn ich sage, mein Code läuft mit Flask, dann meine ich meistens eine ganz bestimmte Version von Flask. Die Community hat sich darauf geeinigt, diese Informationen in einer Datei zu bündeln, die meistens direkt im Hauptverzeichnis des Projekts liegt. Das macht das Onboarding neuer Teammitglieder extrem einfach. Sie klonen das Repository, erstellen eine virtuelle Umgebung und führen den Installationsbefehl aus.

Warum globale Installationen ein Fehler sind

Anfänger machen oft den Fehler, alles global auf ihrem Betriebssystem zu installieren. Das geht eine Weile gut. Irgendwann brauchst du für Projekt A eine alte Version von Django und für Projekt B die neueste. Dein System kann aber nur eine gleichzeitig verwalten. Das Ergebnis ist ein kaputtes System. Profis nutzen deshalb immer virtuelle Umgebungen. Ob du venv, virtualenv oder conda nutzt, ist fast egal, solange du deine Projekte isolierst. Innerhalb dieser Isolation kannst du dann die Liste der Abhängigkeiten sicher einspielen. Es sorgt dafür, dass dein Betriebssystem sauber bleibt und deine Projekte portabel sind.

Die Anatomie einer guten Anforderungsdatei

Eine Datei ist nur so gut wie ihr Inhalt. Wer nur requests reinschreibt, spielt russisches Roulette. Morgen könnte eine neue Version von requests erscheinen, die eine Funktion entfernt, die du nutzt. Dein Build auf dem Server wird scheitern. Deshalb nutzen wir das sogenannte Pinning. Das bedeutet, wir legen die Version exakt fest. Ein Eintrag sieht dann so aus: requests==2.31.0. Das garantiert, dass jeder, der diese Datei nutzt, exakt denselben Code bekommt wie du. Es gibt auch flexiblere Ansätze wie >= für Mindestversionen, aber in der Produktion ist das exakte Gleichheitszeichen der Goldstandard für Stabilität.

## $ pip install -r requirements.txt und der richtige Workflow

Es reicht nicht, den Befehl nur zu kennen. Man muss wissen, wann und wie man ihn einsetzt. Der typische Ablauf beginnt damit, dass du in deiner isolierten Umgebung arbeitest. Du installierst Pakete, testest deinen Code und wenn alles läuft, musst du diesen Zustand einfrieren. Das machst du nicht händisch. Du lässt dir die Liste der aktuell installierten Pakete ausgeben und leitest sie in die Datei um. Erst danach ist dein Projekt bereit für andere. Wenn du auf einen neuen Rechner wechselst, ist der erste Schritt nach dem Auschecken des Codes die Ausführung von $ pip install -r requirements.txt direkt in deinem Terminal. Das Programm liest dann Zeile für Zeile, prüft die Versionen und lädt alles Nötige aus dem Python Package Index herunter.

Dieser Prozess spart Stunden an Fehlersuche. Ich habe oft erlebt, dass Entwickler behaupten, ihr Code sei fertig, nur um dann festzustellen, dass sie vergessen haben, eine kleine Hilfsbibliothek zu erwähnen. Das passiert dir nicht, wenn du den Workflow automatisierst. In modernen CI/CD-Pipelines, etwa bei GitHub Actions oder GitLab CI, ist dieser Schritt fest eingebaut. Der Server baut die Umgebung jedes Mal frisch auf. Wenn dort die Datei fehlt oder fehlerhaft ist, stoppt der Prozess sofort. Das ist gut so. Es verhindert, dass kaputter Code jemals den Endnutzer erreicht.

Fehlerbehebung bei der Installation

Manchmal klemmt es trotzdem. Ein häufiger Grund sind fehlende C-Compiler auf dem Zielsystem. Manche Python-Pakete müssen beim Installieren kompiliert werden. Wenn du unter Windows arbeitest und dein Server auf Linux läuft, kann das zu Problemen führen. Hier helfen sogenannte Wheels. Das sind vorkompilierte Pakete. Ein weiterer Fehlerteufel sind Konflikte zwischen Abhängigkeiten. Paket A will Paket C in Version 1, Paket B will Paket C in Version 2. Das nennt man die Dependency Hell. In solchen Fällen musst du manuell eingreifen und eine Version finden, mit der beide klarkommen. Das ist oft mühsame Detektivarbeit. Aber besser, du findest das lokal heraus, als dass die Anwendung beim Kunden abstürzt.

Die Rolle von Pip in der Linux-Welt

Besonders unter Linux ist Vorsicht geboten. Viele Distributionen wie Ubuntu oder Debian nutzen Python für interne Systemprozesse. Wenn du dort ohne virtuelle Umgebung als Root-Nutzer Pakete installierst, kannst du dein ganzes System zerschießen. Deshalb haben neuere Versionen von Debian Sicherheitsmechanismen eingeführt, die das verhindern. Sie zwingen dich quasi dazu, sauber zu arbeiten. Das ist eine der besten Entscheidungen, die die Maintainer in letzter Zeit getroffen haben. Es schützt Nutzer vor ihrer eigenen Bequemlichkeit.

Strategien für große Projekte

Wenn Projekte wachsen, reicht eine einzige Datei oft nicht mehr aus. Man braucht unterschiedliche Umgebungen. Lokal beim Entwickeln willst du Tools zum Testen oder Formatieren haben, wie pytest oder black. Auf dem Produktionsserver haben diese Pakete nichts zu suchen. Sie vergrößern nur das Sicherheitsrisiko und den Speicherverbrauch. Die Lösung ist die Aufteilung. Man erstellt zum Beispiel eine Datei für die Basis-Abhängigkeiten und eine weitere, die diese inkludiert und die Entwicklungswerkzeuge hinzufügt.

Einige Teams gehen sogar noch weiter. Sie nutzen Tools wie pip-tools. Damit trennst du die Liste deiner direkten Abhängigkeiten von der riesigen Liste aller Unterabhängigkeiten. Du schreibst nur auf, was du wirklich willst, und das Tool berechnet den Rest und fixiert alles in einer separaten Datei. Das sorgt für maximale Sicherheit und macht Updates übersichtlicher. Man sieht sofort, welches Paket ein Update erhalten hat und warum es überhaupt da ist.

Sicherheit und Compliance

Ein oft unterschätzter Aspekt ist die Sicherheit. Jedes Paket, das du über diesen Mechanismus installierst, ist potenzieller Schadcode. In der Vergangenheit gab es immer wieder Angriffe durch "Typosquatting". Dabei registrieren Angreifer Pakete mit Namen, die fast so aussehen wie bekannte Bibliotheken, zum Beispiel requesst statt requests. Wer sich vertippt, holt sich Malware auf den Rechner. Deshalb ist es extrem wichtig, die Einträge in der Liste regelmäßig zu prüfen. Es gibt Tools wie safety, die deine Liste gegen Datenbanken mit bekannten Schwachstellen abgleichen. Das Bundesamt für Sicherheit in der Informationstechnik gibt auf seinen Seiten regelmäßig Warnungen zu Software-Schwachstellen heraus, die auch Entwickler ernst nehmen sollten.

🔗 Weiterlesen: create a index in sql

Dokumentation ist Pflicht

Die Datei allein erklärt nicht alles. Ich schreibe immer einen kleinen Kommentar dazu, warum bestimmte Versionen fixiert wurden. Vielleicht gibt es einen Bug in einer neueren Version, der uns zwingt, auf einer alten zu bleiben. Ohne Kommentar wird ein mutiger Kollege in sechs Monaten versuchen, ein Update zu machen und alles wieder kaputt machen. Kommunikation findet nicht nur im Slack-Channel statt, sondern auch direkt im Code und in den Konfigurationsdateien. Das ist wahre Professionalität.

Alternative Tools und die Zukunft

Wir dürfen nicht ignorieren, dass die Python-Welt sich weiterentwickelt. Es gibt mittlerweile modernere Ansätze als die klassische Textdatei. Tools wie Poetry oder PDM nutzen die pyproject.toml Datei. Das ist ein neuer Standard, der vom Python Packaging Authority gefördert wird. Diese Tools lösen viele Probleme der klassischen Methode eleganter, zum Beispiel das automatische Auflösen von Konflikten. Aber die Realität in den meisten Firmen sieht anders aus. Dort regiert immer noch der Standardansatz. Wenn du in ein bestehendes Projekt einsteigst, ist die Wahrscheinlichkeit bei fast 100 Prozent, dass du auf eine herkömmliche Liste triffst.

Trotzdem lohnt sich der Blick über den Tellerrand. Die Konzepte bleiben die gleichen: Isolation, Versionierung und Reproduzierbarkeit. Ob du am Ende eine Datei namens requirements.txt oder eine Lock-Datei von Poetry hast, ist zweitrangig. Wichtig ist, dass du verstehst, was im Hintergrund passiert. Du musst wissen, wie Python Pfade verwaltet und wo die Pakete physisch auf der Festplatte landen. Nur dann kannst du Probleme wirklich lösen, statt nur blind Befehle abzutippen.

Best Practices für die Versionskontrolle

Deine Anforderungsliste gehört zwingend ins Git. Ohne Ausnahme. Sie ist Teil deines Quellcodes. Wenn du eine Änderung an den Abhängigkeiten vornimmst, sollte das ein eigener Commit sein. So kannst du jederzeit zu einem alten Stand zurückkehren, falls ein Update Probleme verursacht. Ich empfehle auch, die Datei alphabetisch zu sortieren. Das klingt banal, verhindert aber sogenannte Merge-Conflicts, wenn zwei Entwickler gleichzeitig neue Pakete hinzufügen. Kleine Kniffe wie diese machen den Alltag im Team deutlich entspannter.

Docker und Python

In der Welt der Containerisierung wird das Thema noch wichtiger. Ein Dockerfile für eine Python-Anwendung besteht fast immer aus denselben Schritten: Betriebssystem wählen, Code kopieren und dann die Abhängigkeiten installieren. Hier ist die Reihenfolge entscheidend für die Geschwindigkeit. Man kopiert erst nur die Anforderungsdatei und führt die Installation aus, bevor man den restlichen Code kopiert. Warum? Weil Docker Schichten zwischenspeichert. Wenn du nur deinen Code änderst, aber nicht die Abhängigkeiten, muss Docker beim nächsten Build die Pakete nicht neu herunterladen. Das spart bei jedem Build Minuten an Zeit. In großen Firmen mit hunderten Builds am Tag summiert sich das zu enormen Ersparnissen bei den Rechenkosten.

Praktische Anwendung im Alltag

Stell dir vor, du baust eine kleine Web-App mit FastAPI. Du startest lokal und installierst fastapi und uvicorn. Alles super. Dann merkst du, dass du für die Datenbank SQLAlchemy brauchst. Du installierst es. Ein paar Tage später willst du die App auf einen günstigen Server bei einem Cloud-Anbieter schieben. Ohne deine Liste der Pakete müsstest du dich jetzt erinnern, was du alles installiert hast. Du würdest garantiert etwas vergessen. Mit der Liste ist es eine Sache von Sekunden. Du lädst deinen Code hoch, erstellst die Umgebung und lässt Python die Arbeit machen.

Es ist auch eine Form der Qualitätssicherung. Wenn ich einen Freelancer beauftrage, erwarte ich, dass er mir ein fertiges Paket liefert. Dazu gehört eine saubere Struktur. Wenn ich erst raten muss, welche Software ich brauche, um seinen Code zu starten, hat er seinen Job nicht richtig gemacht. Ein professionelles Repository ist wie eine Visitenkarte. Es zeigt, dass der Autor sauber arbeitet und an die Leute denkt, die nach ihm kommen.

Die Bedeutung für Data Science

Gerade im Bereich Data Science und KI sind die Abhängigkeiten oft riesig. Bibliotheken wie PyTorch oder TensorFlow wiegen mehrere Gigabyte. Hier ist es noch kritischer, Ordnung zu halten. Oft hängen diese Pakete auch von ganz bestimmten Grafiktreibern ab. Während die Textdatei die Python-Seite abdeckt, braucht man oft noch zusätzliche Dokumentation für die Hardware-Anforderungen. Aber die Basis bleibt die Python-Umgebung. Wer hier schlampig ist, kann seine Experimente niemals exakt wiederholen. In der Wissenschaft ist das tödlich für die Glaubwürdigkeit.

Umgang mit veralteten Paketen

Man darf seine Abhängigkeiten nicht verrotten lassen. Einmal im Monat sollte man schauen, ob es Sicherheitsupdates gibt. Tools wie Dependabot erledigen das heute automatisch. Sie erstellen einen Pull Request, sobald eine neue Version verfügbar ist. Du musst nur noch die Tests laufen lassen und auf "Merge" klicken. Das ist ein riesiger Fortschritt gegenüber früher, als man mühsam manuell nach Updates suchen musste. Aber Vorsicht: Updates können Dinge kaputt machen. Vertraue niemals blind auf ein Update, ohne dass deine Testsuite grünes Licht gibt.

Zusammenhänge verstehen

Was passiert eigentlich technisch? Wenn du den Befehl ausführst, kontaktiert dein Rechner einen Server. Standardmäßig ist das PyPI. Dort liegen tausende Projekte als komprimierte Dateien bereit. Dein Rechner lädt diese Dateien, entpackt sie und schiebt die enthaltenen Python-Dateien in einen speziellen Ordner namens site-packages. Von dort aus kann Python sie finden, wenn du import schreibst. Das ist kein magischer Prozess. Es ist simples Verschieben von Dateien nach festen Regeln. Wenn man das einmal verstanden hat, verliert der ganze Vorgang seinen Schrecken.

Lokale Caches nutzen

Wenn du oft die gleichen Pakete installierst, zum Beispiel weil du viele kleine Mikroprojekte hast, nutzt Pip einen lokalen Cache. Er lädt die Dateien nicht jedes Mal neu aus dem Internet, sondern nimmt sie von deiner Festplatte. Das schont die Bandbreite und geht viel schneller. Manchmal kann dieser Cache aber auch Probleme verursachen, wenn eine Datei beschädigt ist. Dann hilft es, den Cache zu leeren und von vorne anzufangen. Es ist wie beim Browser: Manchmal muss man einfach mal aufräumen.

Abhängigkeiten von privaten Servern

In großen Unternehmen möchte man oft nicht, dass der eigene Code oder sensible Bibliotheken auf öffentlichen Servern liegen. Man nutzt dann eigene Instanzen wie Artifactory oder DevPi. Man kann Pip problemlos sagen, dass es nicht bei PyPI, sondern beim firmeneigenen Server suchen soll. Auch das lässt sich in der Konfiguration festlegen. So bleibt das geistige Eigentum der Firma geschützt und man ist unabhängig von der Verfügbarkeit externer Dienste.

👉 Siehe auch: midea silent cool 26

Nächste Schritte für deinen Workflow

Damit du das Wissen direkt umsetzen kannst, hier ist der ideale Fahrplan für dein nächstes oder aktuelles Projekt. Zuerst solltest du prüfen, ob du bereits in einer virtuellen Umgebung arbeitest. Wenn nicht, lege eine an. Das ist der wichtigste Schritt für Ordnung auf deinem System. Danach installierst du nur die Pakete, die du wirklich brauchst.

  1. Erstelle eine virtuelle Umgebung mit python -m venv venv und aktiviere sie.
  2. Installiere deine benötigten Pakete wie gewohnt.
  3. Erzeuge deine Anforderungsliste mit pip freeze > requirements.txt.
  4. Prüfe die Datei kurz manuell, ob sich kein Müll eingeschlichen hat.
  5. Füge die Datei zu deinem Git-Repository hinzu.
  6. Teste den Prozess auf einem anderen Rechner oder in einem neuen Ordner, indem du dort $ pip install -r requirements.txt ausführst.

Wenn das alles ohne Fehler durchläuft, hast du ein solides Fundament für deine Entwicklung gelegt. Es wirkt am Anfang vielleicht wie ein unnötiger Zusatzschritt, aber es ist die beste Versicherung gegen zukünftige Kopfschmerzen. Wer einmal eine Nacht damit verbracht hat, eine kaputte Produktionsumgebung zu flicken, wird diesen Prozess nie wieder infrage stellen. Sauberkeit im Code beginnt bei der Infrastruktur. Die Disziplin, die du hier zeigst, spiegelt sich meistens auch in der Qualität deiner restlichen Arbeit wider. Es gibt keinen Grund, es nicht richtig zu machen. Python bietet uns alle Werkzeuge dafür, wir müssen sie nur konsequent nutzen. Es ist wie beim Kochen: Wer seinen Arbeitsplatz nicht sauber hält, wird am Ende kein perfektes Gericht servieren können. Also, halte deine Abhängigkeiten im Zaum und dein Code wird es dir danken.

HH

Hannah Hartmann

Mit faktenbasierter Arbeitsweise liefert Hannah Hartmann Beiträge, die Leserinnen und Lesern Orientierung im Nachrichtengeschehen geben.