Eine (sanfte) Einführung in die Verwaltung von Python-Abhängigkeiten
Lucian Irsigler
14. September 2021
0 Min. LesezeitPython gilt als „einfache“ Sprache – sie ist leicht zu verwenden und Skripte lassen sich einfach entwickeln, um zahlreiche Aufgaben zu erledigen: vom Web-Scraping über die Automatisierung bis hin zur Entwicklung umfangreicher Webanwendungen und sogar zur Datenwissenschaft. Abhängigkeiten werden in Python jedoch ganz anders verwaltet als in anderen Sprachen, und die vielen Möglichkeiten zum Einrichten einer Umgebung und zur Auswahl eines Paketmanagers sorgen für zusätzliche Verwirrung. In diesem Beitrag sehen wir uns verschiedene Ansätze für die Verwaltung von Python-Abhängigkeiten an und werfen einen kurzen Blick auf die Sicherheit von Abhängigkeiten.
Python als interpretierte Sprache
Bei einer interpretierten Sprache wird das Skript nicht in Maschinencode oder eine ausführbare Datei übersetzt. Stattdessen wird es an ein anderes Programm weitergegeben – in diesem Fall an den Python-Interpreter –, das den Code ausführt.
Wenn ich ein einfaches Python-Skript wie dieses schreibe:
Und es anschließend so ausführe:
Erhalten wir folgende Ausgabe:
Ist Ihnen aufgefallen, dass sich in dem Ordner, in dem dieser Code ausgeführt wurde, keine ausführbaren Dateien wie .exe befinden? Das liegt daran, dass die Python-Executable die Datei zur Laufzeit kompiliert und ausführt – nicht im Voraus.
Der Trick dabei ist, dass eine .exe-Datei den Python-Code ausführt. Main.py wird an diese .exe-Datei weitergegeben und dann ausgeführt. Dabei handelt es sich um den kompilierten Python-Interpreter, der über den Pfad Ihrer Umgebung verfügbar ist.

Was ist eine Abhängigkeit in Python?
Eine Abhängigkeit in Python ist wie in jeder anderen Sprache eine Codebibliothek, die zum Ausführen des Quellcodes des Skripts benötigt wird, in das sie importiert wurde.
Wenn Sie beispielsweise mit einer PostgreSQL-Datenbank interagieren möchten, haben Sie zwei Möglichkeiten: Sie schreiben alle Funktionen selbst oder installieren das Paket postgres, das bereits die Abfragefunktionen und weitere benötigte Funktionen enthält.
Wie würden Sie also das passende PostgreSQL-Paket installieren?
Ein wichtiger Aspekt der Abhängigkeitsverwaltung ist – unabhängig von der Sprache –, sorgfältig zu prüfen, ob das Paket gut gepflegt wird und keine Sicherheitsprobleme aufweist. Einen Überblick über den Zustand eines Pakets erhalten Sie mit dem Snyk Advisor.

Mit Snyk Advisor können Sie den Zustand von Bibliotheken in verschiedenen Ökosystemen wie PyPI und npm recherchieren. Sie können auch Docker-Basis-Images sowie deren allgemeine Statistiken, Beliebtheit, verfügbare Tags und weitere nützliche Informationen prüfen.
Kehren wir zu unserem PostgreSQL-Projekt zurück und prüfen, ob der Zustand des Pakets postgres einen akzeptablen Schwellenwert erreicht:

Das Paket postgres schneidet offenbar nicht besonders gut ab und erhält eine Bewertung von 56 von 100. Es ist mit rund 10.000 Downloads pro Woche nicht besonders beliebt. Außerdem liegt die letzte Veröffentlichung zwei Jahre zurück – ein Hinweis darauf, dass die Wartung möglicherweise zu wünschen übrig lässt.
Wenn Sie auf der Seite zu den Abschnitten für Sicherheit und Community scrollen, fällt unter anderem das Lizenzrisiko für die neueste Paketversion auf – Version 3.0.0 vom 19. Oktober 2019. Das sollte genauer geprüft werden:

Wenn Sie sich für die Verwendung dieses Pakets entscheiden, ist das Paket postgres nach dem zuvor beschriebenen Schritt pip install auf Ihrem System verfügbar.
So importieren Sie es in Ihre Projekte:
Jetzt sehen Sie, wie unübersichtlich Abhängigkeiten in Python werden können. Wenn ich dieses Skript einer befreundeten Person gebe, die Python nicht installiert hat, und sie versucht, es auszuführen, tritt ein Fehler auf.
Warum tritt ein Fehler auf?
Zunächst muss die befreundete Person Python installiert haben. Außerdem benötigt sie die Pakete, von denen Ihr Projekt abhängt – in diesem Fall postgres.
Zusätzlich benötigt die Python-Umgebung alle Module, die zum Ausführen des Skripts erforderlich sind. Das ist vergleichbar mit anderen Sprachen, wenn eine bestimmte Bibliothek oder ein Quellcode fehlt.
Wenn ich mein Python-Projekt also mit einer befreundeten Person teilen möchte, sind zwei Voraussetzungen zu erfüllen:
Alle Dateien, die zum Ausführen von Python erforderlich sind
Das Paket
postgres
Verwaltung von Python-Abhängigkeiten
Wenn Sie Ihre Python-Projekte mit anderen teilen möchten, müssen Sie eine Datei namens requirements.txt beilegen. Mit dem Befehl pip können Sie gezielt die Abhängigkeiten installieren, die das Projekt benötigt:
Wir verwenden pip3 statt einfach nur pip, damit nicht versehentlich die falsche Version installiert wird. pip verweist auf die Python-Version, die Sie zuerst installiert haben. Wenn Sie also zuerst Python 2 installiert haben, verweist der Befehl pip auf pip2, das zum Installieren von Python-2-Paketen verwendet wird.
Der Begriff pip3 weist pip also ausdrücklich an, das Python-3-Paket zu installieren.
Wenn auf Ihrem Computer überhaupt keine Python-2-Version installiert ist, brauchen Sie sich darüber keine Gedanken zu machen.
Mit diesem Befehl in der Konsole können Sie prüfen, welches pip (pip2 oder pip3) Ihr pip-Befehl verwendet:
Dieser Befehl liest die Textdatei requirements.txt, in der alle für dieses Projekt erforderlichen Abhängigkeiten aufgeführt sind, und installiert anschließend die darin gelisteten Pakete.
Damit also tatsächlich Pakete installiert werden, wenn jemand diesen Befehl ausführt:
müssen Sie diese Paketmanifestdatei erstellen.
Pakete sollten in dieser Datei in folgendem Format aufgeführt werden:
<Package name> <Higher/equal to> <some version>
Zum Beispiel:
Die Vergleichsoperatoren dienen der Versionsprüfung. So wird sichergestellt, dass der Paketmanager pip die richtigen Versionen für Ihr Projekt installiert. Wenn keine Versionsangaben gemacht werden, wird die neueste Version installiert.
Wenn Sie also den Quellcode Ihres Projekts mit anderen teilen, bitten Sie sie, den Befehl pip3 mit der Datei requirements.txt auszuführen, die Ihrem Projekt beiliegt. Dadurch erhalten sie die erforderlichen Open-Source-Abhängigkeiten, um Ihr Projekt auszuführen.
Was ist mit Python-Abhängigkeitsmanagern?
Neben der Paketmanifestdatei, die wir kennengelernt haben (requirements.txt), gibt es Paketmanager, mit denen Sie die Pflege und Verwaltung von Projektabhängigkeiten in Python vereinfachen können. Hier sind einige, die Sie installieren und verwenden können:
Poetry
Mit Poetry können Sie Lockfiles erstellen, die die Abhängigkeiten Ihres Projekts enthalten. Bei der Installation des Pakets wird automatisch auch das Lockfile installiert. Der Vorteil: Mit Poetry lassen sich die für das Projekt benötigten Abhängigkeiten einfach aktualisieren.
Poetry lässt sich über Befehlszeilentools bedienen. Befehle wie diese:
Mit diesen Befehlen können Sie die Abhängigkeiten in diesem Lockfile ganz einfach nachverfolgen und hinzufügen und sie anschließend Ihrem PyPI-Paket hinzufügen.
Mit dem Flag --tree können Sie außerdem ein Baumdiagramm der Abhängigkeiten Ihres Projekts anzeigen:
Mit Poetry lassen sich Abhängigkeiten ganz einfach verwalten und hinzufügen.
pyenv
pyenv ist ein einfaches Tool, mit dem Sie zwischen verschiedenen Python-Versionen wechseln können. So können Sie prüfen, ob Ihre Abhängigkeiten mit einer älteren Python-Version Probleme verursachen. Da dies die Hauptfunktion ist, fehlen pyenv einige Funktionen anderer Abhängigkeitsmanager wie Poetry.
Wenn Sie jedoch ein Tool benötigen, um zu prüfen, ob Ihr Paket mit einer älteren Python-Version funktioniert, ist pyenv nützlich.
Setuptools
Auch dieses Paket unterstützt die Paketverwaltung. Es ist etwas aufwendiger als beispielsweise Poetry, erfüllt aber seinen Zweck.
Wie der Name schon sagt, hilft Setuptools dabei, Ihr Paket für Nutzerinnen und Nutzer einzurichten. Dazu gehört natürlich auch, dass die richtigen Pakete zum Ausführen des Skripts vorhanden sind.
Für setuptools erstellen Sie zwei Dateien: eine Datei pyproject.toml und eine Datei setup.py/setup.cfg.
In die .toml-Datei fügen Sie den folgenden Code ein, um Python mitzuteilen, dass Sie mit Setuptools die Informationen zu Ihrem Paket angeben:
In Ihrer Datei setup.py/setup.cfg könnte dann beispielsweise Folgendes stehen:
Jetzt benötigen Sie ein Build-Tool, zum Beispiel PyPA build. Ihr Projekt wird in eine .gz-Datei gepackt und ist anschließend für die Verteilung bereit.
Setuptools erfordert mehr manuelle Arbeit von Ihnen, ist aber effizient bei der Paketverwaltung und stellt sicher, dass Ihre Nutzerinnen und Nutzer alle zum Ausführen des Skripts erforderlichen Pakete haben.
Diese drei Abhängigkeitsmanager gehören zu den beliebteren Optionen. Jeder hat seine Stärken und Schwächen. Unabhängig davon, für welchen Sie sich entscheiden: Alle funktionieren gut und effizient und vereinfachen so den Albtraum der Abhängigkeitsverwaltung in Python.

Noch besser: Die Snyk CLI zeigt Ihnen den Abhängigkeitspfad, der zur Schwachstelle führt, und wie Sie das Problem beheben können – durch ein Upgrade auf eine neuere Version mit einem Sicherheitsfix.
Zum Abschluss
Neben Schwachstellen in Open-Source-Bibliotheken gibt es weitere Sicherheitsrisiken. Dazu zählen beispielsweise unsicherer Code in Ihren Python-Anwendungen oder unsichere Container, in denen Ihre Python-Anwendungen gebündelt sind. Daniel Berman hat einen ausführlichen Artikel darüber geschrieben, wie Sie mit Snyk in die sichere Python-Entwicklung einsteigen. Als Ergänzung zu diesem Blogbeitrag kann ich ihn Ihnen sehr empfehlen.
Ich hoffe, Sie haben gern etwas über die Verwaltung von Python-Abhängigkeiten und Sicherheit gelernt. Wenn Sie mehr über Python-Sicherheit lesen möchten, sehen Sie sich diese Beiträge an:
Starten Sie mit Capture the Flag
Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Herausforderungen lösen.
Lucian Irsigler ist ein leidenschaftlicher Programmierer, der die Komplexität des Lebens liebt.


