Python-Programme über PIP unter Linux installieren

Rate this post

Vor sehr vielen Jahren hat die nach der britischen Komikertruppe benannte Skriptsprache Python unter Linux das altehrwürdige Perl abgelöst. Das heißt, jede Linux Distribution enthält einen Python-Interpreter von Hause aus. Eigentlich eine recht praktische Sache. Eigentlich! Wenn da nicht das leidige Thema mit der Sicherheit wäre. Aber fangen wir einmal der Reihe nach an, denn dieser kleine Artikel ist für Leute gedacht, die unter Linux in Python geschriebene Software zum Laufen bringen möchten, aber selbst weder Python kennen noch irgendetwas mit Programmieren am Hut haben. Daher ein paar kleine Hintergrundinformationen, um zu verstehen, worum es überhaupt geht.

Alle aktuellen Linux Varianten, die von der Distribution Debian abgeleitet sind, also Ubuntu, Mint und so weiter, werfen einen kryptischen Fehler, wenn man versucht, ein Pythonprogramm zu installieren. Da man vermeiden möchte, dass wichtige Systembibliotheken, die in Python geschrieben wurden, durch die Installation zusätzlicher Programme überschrieben werden und dadurch ein Fehlverhalten im Betriebssystem hervorrufen, wurde ein Schutz eingebaut, der das verhindert. Leider steckt auch hier wie so oft der Teufel im Detail.

ed@P14s:~$ python3 -m pip install ansible
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.
    
    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.
    
    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.
    
    See /usr/share/doc/python3.13/README.venv for more information.

Als Lösung soll nun eine virtuelle Umgebung eingerichtet werden. Debian 12 und auch das gerade im August 2025 frisch erschienene Debian 13 nutzen Python in der Version 3. Python2 und Python 3 sind zueinander nicht kompatibel. Das heißt, in Python2 geschriebene Programme laufen nicht ohne Weiteres in Python 3.

Wenn man nun unter Python irgendein Programm installieren möchte, erledigt dies der sogenannte Paketmanager. Die meisten Programmiersprachen haben einen solchen Mechanismus. Der Paketmanager für Python heißt PIP. Hier kommen schon die ersten Komplikationen ins Spiel. Es gibt pip, pip3 und pipx. Solche Namensinkonsistenzen findet man auch beim Python Interpreter selbst. Version 2 startet man auf der Konsole mit python und Version 3 mit python3. Da sich dieser Artikel auf Debian 12 / Debian 13 und seine Derivate bezieht, wissen wir, dass zumindest mal Python 3 am Start ist. Um die tatsächliche Python Version zu erfahren, kann man auf der Shell auch python3 -V eingeben, was bei mir die Version 3.13.5 zutage fördert. Versucht man indies python oder python2 kommt eine Fehlermeldung, dass der Befehl nicht gefunden werden konnte.

Schauen wir uns zuerst einmal an, was überhaupt pip, pip3 und pipx bedeuten soll. PIP selbst heißt nichts anderes als Package Installer for Python [1]. Bis Python 2 galt PIP und ab Version 3 haben wir entsprechend auch PIP3. Ganz speziell ist PIPX [2] welches für isolierte Umgebungen gedacht ist, also genau das, was wir benötigen. Daher geht es im nächsten Schritt darum, PIPX zu installieren. Das erreichen wir recht leicht über den Linux-Paketmanager: sudo apt install pipx. Um festzustellen, welche PIP Variante bereits auf dem System installiert ist, benötigen wir folgenden Befehl: python3 -m pipx --version, der in meinem Fall 1.7.1 ausgibt. Das heißt, ich habe auf meinem System als Ausgangsbasis das originale Python3 und dazu PIPX installiert.

Mit der gerade beschriebenen Voraussetzung kann ich nun unter PIPX alle möglichen Python Module installieren. Der Grundbefehl lautet pipx install <module>. Um ein nachvollziehbares Beispiel zu schaffen, wollen wir jetzt im nächsten Schritt Ansible installieren. Auf die Verwendung von pip und pip3 sollte verzichtet werden, da diese zum einen erst installiert werden müssen und zum anderen zu dem eingangs krypischen Fehler führen.

Ansible [3] ist ein Programm, das in Python geschrieben wurde und ab der Version 2.5 auf Python 3 migriert wurde. Nur sehr knapp ein paar Worte zu dem, was Ansible selbst für ein Programm ist. Ansible gehört in die Klasse der Konfigurationsmanagementprogramme und erlaubt es völlig automatisiert mit einem Skript Systeme zu provisionieren. Eine Provisionierung kann zum Beispiel als virtuelle Maschine erfolgen und umfasst das Festlegen der Hardware-Ressourcen (RAM, HDD CPU Kerne, etc.), Installieren des Betriebssystems, das Einrichten des Benutzers und das Installieren und Konfigurieren weiterer Programme.

Als Erstes müssen wir Ansible mit pipx install ansible installieren. Wenn die Installation beendet ist, können wir den Erfolg mit pipx list überprüfen, was bei mir zu folgender Ausgabe führt:

ed@local:~$ pipx list
venvs are in /home/ed/.local/share/pipx/venvs
apps are exposed on your $PATH at /home/ed/.local/bin
manual pages are exposed at /home/ed/.local/share/man
   package ansible 12.1.0, installed using Python 3.13.5
    - ansible-community

Die Installation ist aber hier noch nicht beendet, denn der Aufruf ansible –version wird mit einer Fehlermeldung quittiert. Das Problem, welches sich hier ergibt, hat etwas mit der Ansible Edition zu tun. Wie wir bereits in der Ausgabe von pipx list sehen können, haben wir die Community Edition installiert. Weswegen der Befehl ansible-community --version lautet, der bei mir aktuell die Version 12.2.0 zutage fördert.

Wer lieber in der Konsole ansible anstatt ansible-community eingeben möchte, kann das über eien alias erreichen. Das Setzen des Alias ist hier nicht ganz so trivial, da dem Alias Parameter übergeben werden müssen. Wie das gelingt, ist aber Thema eines anderen Artikels.

Gelegentlich kommt es aber auch vor, dass Pythonprogramme über PIPX nicht installiert werden können. Ein Beispiel hierfür ist streamdeck-ui [4]. Die Hardware StreamDeck von Elgato konnte lange Zeit unter Linux mit dem in Python implementierten stremdeck-ui genutzt werden. Mittlerweile gibt es noch eine Alternative namens Boatswain, die nicht in Python geschrieben wurde, auf die man besser ausweichen sollte. Denn leider führt die Installation von streamdeck-ui zu einem Fehler, der aus der Abhängigkeit zur Bibliothek ‘pillow’ herrührt. Versucht man nun, das Installationsscript aus dem Git Repository von streamdeck-ui zu nutzen, findet man einen Verweis auf die Installation von pip3, über das streamdeck-ui bezogen werden kann. Kommt man dann an den Punkt, um den Befehl pip3 install --user streamdeck_ui auszuführen, erhält man die Fehlermeldung, externally-managed-environment die ich zu Anfang des Artikels bereits beschrieben habe. Da wir bereits PIPX nutzen, ist es nicht zielführend, eine weitere virtuelle Umgebung für Python Programme zu erstellen, da diese auch nur wieder zu dem Fehler mit der Bibliothek pillow führen wird.

Da ich selbst kein Python-Programmierer bin, aber durchaus einige Erfahrungen mit komplexen Abhängigkeiten in großen Java Projekten habe und das Programm streamdeck-ui eigentlich besser als Boatwain empfunden hatte, habe ich mich ein wenig im GitHub Repository umgeschaut. Zuerst fällt auf, dass die letzte Aktivität im Frühjahr 2023 stattgefunden hat und eine Reaktivierung eher unwahrscheinlich ist. Schauen wir uns dennoch einmal die Fehlermeldung genauer an, um eine Idee zu bekommen, wie man bei Installationen anderer Programme das Problem eingrenzen kann.

Fatal error from pip prevented installation. Full pip output in file:
    /home/ed/.local/state/pipx/log/cmd_pip_errors.log

pip seemed to fail to build package:
    'pillow'

Wenn man nun einen Blick in die zugehörige Logfile wirft, erfährt man, dass die Abhängigkeit von pillow kleiner als Version 7 und größer als Version 6.1 definiert ist, was zur Verwendung von der Version 6.2.2 führt. Schaut man nun einmal nach, was pillow eigentlich macht, erfährt man, dass dies eine Bibliothek für Python 2 war, mit der Grafiken gerendert werden konnten. Die in streamdeck-ui verwendete Version ist ein Fork von pillow für Python 3 und Ende 2025 bereits in der Version 12 verfügbar. Möglicherweise könnte das Problem dadurch behoben werden, indem eine aktuelle Version von pillow zum Einsatz kommt. Damit das gelingt, sind mit hoher Wahrscheinlichkeit auch Anpassungen am Code von streamdeck-ui vorzunehmen, da vermutlich seit der Version 6.2.2 einige Inkompatibilitäten der genutzten Funktionen vorhanden sind.

Mit dieser Analyse sehen wir, dass die Wahrscheinlichkeit, streamdeck-ui unter pip3 zum Laufen zu bekommen, in dasselbe Ergebnis führt wie mit PIPX. Wer nun auf die Idee kommt, unbedingt auf Python 2 zu downzugraden, um alte Programme zum Laufen zu bekommen, der sollte dies besser in einer gesonderten, isolierten Umgebung, zum Beispiel mit Docker versuchen. Python 2 hat seit vielen Jahren keinen Support durch Updates und Security Patches, weswegen eine parallele Installation zu Python 3 auf dem eigenen Betriebssystem keine gute Idee ist.

Wir sehen also, dass die anfangs beschriebene Fehlermeldung gar nicht so kryptisch ist, wenn man indes gleich auf PIPX setzt. Bekommt man sein Programm dann immer noch nicht installiert, hilft ein Blick auf die Fehlermeldung, der uns meist darüber aufklärt, dass wir ein veraltetes und nicht mehr gepflegtes Programm verwenden wollen.

Resources

Abonnement / Subscription

[English] This content is only available to subscribers.

[Deutsch] Diese Inhalte sind nur für Abonnenten verfügbar.


Dieser Eintrag wurde von Elmar Dott unter Artikel veröffentlicht und mit , , , verschlagwortet. Setze ein Lesezeichen für den Permalink.
Elmar Dott

Über Elmar Dott

Elmar Dott realisiert seit über 20 Jahren als freier Berater in internationalen Projekten große Web-Applikationen. Seine Schwerpunkte sind DevOps, Konfigurationsmanagement, Software-Architekturen & Release Management. Als Trainer teilt er sein Wissen in Schulungen und spricht auch regelmäßig auf Konferenzen über aktuelle Themen.

Schreibe einen Kommentar