mitmario.dev

Pakete und pip

Python Sandbox 5 Min Lesezeit 3 BeispieleLektion 1 von 5

Python kann von sich aus keine echte Excel-Datei schreiben. Eine ordentliche Tabelle im Terminal auch nicht. Alles, was du bisher benutzt hast, also csv, json, decimal und pathlib, kam mit Python selbst, aus der Standardbibliothek. Die reicht für erstaunlich viel. Aber nicht für alles, und für Webseiten oder Tests gibt es Werkzeuge, die bequemer sind als das, was mitkommt. So etwas schreibt man nicht selbst. Man holt es sich als Paket (package), das jemand anderes geschrieben und für alle veröffentlicht hat.

PyPI und pip

Veröffentlicht werden Pakete auf PyPI, dem Python Package Index unter pypi.org. Dort liegen über 900.000 Projekte. Manche sind kleine Helfer mit einer einzigen Datei, an anderen arbeiten Hunderte Leute mit. Geholt werden sie mit pip, dem Programm zum Installieren, das Python gleich mitbringt.

python -m pip install tabulate lädt das Paket tabulate von PyPI und legt es dorthin, wo dieses Python seine Pakete sucht. Danach findet import tabulate es. Vorher nicht.

Ein Paket, das fehlt
from tabulate import tabulate

print(tabulate([["Brot", 2.49], ["Milch", 1.19]]))

ModuleNotFoundError: No module named 'tabulate' heißt, dass es kein Modul mit diesem Namen gibt. Python hat in der Standardbibliothek nachgesehen, im Ordner des Programms und bei den installierten Paketen, und nichts gefunden. Diesen Fehler sieht jeder, der ein fremdes Programm startet, ohne vorher dessen Pakete zu installieren. Mit python -m pip list aus der Befehlsleiste siehst du, welche Pakete dieses Python kennt. Hier ist das nur pip selbst.

Dasselbe mit dem Paket
from tabulate import tabulate

print(tabulate([["Brot", 2.49], ["Milch", 1.19]]))

Derselbe Code, diesmal mit dem Paket, und schon steht die Tabelle da. Was sie alles kann, kommt in der nächsten Lektion. python -m pip list aus der Befehlsleiste nennt jetzt zwei Pakete.

Mehr über ein Paket erfährst du mit python -m pip show tabulate. Da stehen die Version und der Ordner, in dem es liegt, und unter Requires die anderen Pakete, die es braucht. Bei tabulate steht dort nichts. Bei vielen anderen steht da eine ganze Reihe, und die holt pip beim Installieren gleich mit.

Ohne Netz

Die Maschine hier hat kein Netz, das war von Anfang an so. Die Pakete, die der Kurs benutzt, liegen deshalb fertig bereit, und jede Lektion bekommt genau die, die sie braucht. Wenn du hier python -m pip install tabulate tippst, wird also nichts geladen. Die Antwort ist Requirement already satisfied, das Paket ist schon da.

Ein Paket, das nicht bereitliegt, bekommst du hier nicht. pip versucht ein paar Mal, ins Netz zu kommen, und gibt dann auf. Auf deinem Rechner holt derselbe Befehl das Paket wirklich aus dem Netz.

Warum python -m pip

Es gibt auch einen Befehl pip allein, und in vielen Anleitungen steht einfach pip install. Der Haken ist, dass pip immer zu einem bestimmten Python gehört. Und auf vielen Rechnern gibt es mehr als eins. Auf dem Mac liegt neben deinem Python oft noch das von Apple, unter Windows sammeln sich über die Jahre mehrere Versionen an.

Dann installiert pip das Paket vielleicht für ein anderes Python als das, mit dem du dein Programm startest. Die Installation hat geklappt, und trotzdem steht am Ende der ModuleNotFoundError von oben da. python -m pip meint das pip genau dieses Pythons. Welches das ist, zeigt python -m pip --version aus der Befehlsleiste, ganz hinten steht (python 3.14). Auf dem Mac und unter Linux tippst du python3 -m pip, unter Windows geht auch py -m pip.

Bevor du zu Hause das erste Paket installierst, lohnt sich noch Lektion 13.3. Unter neueren Versionen von Ubuntu und Debian und mit Python aus Homebrew auf dem Mac lässt pip dich ohne eine eigene Umgebung für das Projekt gar nicht installieren. Das ist dort so gewollt.

Wem du da Zugriff gibst

Was ein Import alles darf
import tabellen_hilfe

print("Hier fängt mein Programm an.")
tabellen_hilfe.tabelle([["Brot", 2.49], ["Milch", 1.19]])

tabellen_hilfe.py sieht aus wie ein harmloses Hilfsmodul. Gestartet wird main.py, und trotzdem stehen die Dateien des Ordners da, bevor das Programm seine erste eigene Zeile erreicht. Beim import führt Python die Datei einmal von oben bis unten aus. Deswegen gab es in Lektion 10.3 die Wache.

Hier liest das Modul nur Namen. Genauso gut könnte es den Kontoauszug lesen und ins Netz schicken, mit allen Rechten, die dein Programm hat, und die Tabelle käme trotzdem. Für ein Paket von PyPI gilt dasselbe. Es ist fremder Code, der auf deinem Rechner läuft.

Auf PyPI darf jeder ein Paket hochladen, unter fast jedem Namen, der noch frei ist. Das nutzen manche aus und nehmen Namen, die sich nur um einen Buchstaben von einem bekannten Paket unterscheiden (typosquatting). Ende 2019 flogen zwei solche Pakete auf. Das eine hieß jeIlyfish, mit einem großen I statt des kleinen l im bekannten jellyfish. Das andere war python3-dateutil und gab sich als das bekannte python-dateutil aus.

Beide taten, was die Originale tun. Nebenbei schickte jeIlyfish die geheimen Schlüssel des Rechners, mit denen man sich bei Servern anmeldet, an einen fremden Server, und python3-dateutil brachte jeIlyfish als Abhängigkeit gleich mit. Fast ein Jahr lag jeIlyfish auf PyPI, bevor es jemandem auffiel.

Vor einer Installation lohnen sich deshalb zwei Minuten:

  • Den Namen kopieren statt abtippen, am besten aus der Dokumentation des Projekts.
  • Die Seite auf pypi.org ansehen: seit wann es das Paket gibt, wie viele Versionen es hatte, ob ein Link zum Quellcode da ist und wer es pflegt. Ein Paket, dessen Name dem eines bekannten fast gleicht, ist verdächtig, auch wenn es schon länger da ist. jeIlyfish war fast ein Jahr alt.
  • Fragen, ob es das Paket wirklich braucht. Für vieles reicht die Standardbibliothek. Und ein Paket, das du nicht installierst, kann dir auch nichts tun.

Zum Mitnehmen

Ein Paket ist Code von jemand anderem, veröffentlicht auf PyPI, und pip holt es von dort. Mit python -m pip landet es bei genau dem Python, mit dem dein Programm läuft. Beim import läuft ein Paket mit allen Rechten deines Programms, deshalb lohnt sich vorher ein Blick darauf, von wem es kommt.

Jetzt du

Basis Konto, kostenlos

Im Editor änderst du die Beispiele dieser Lektion und lässt sie gleich laufen. So merkst du am schnellsten, ob es sitzt.

Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.

In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.

Was in dieser Lektion steckt

  • Artikel mit 3 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.