Python – Das Externally Managed Environment Problem

oder Profi vs. Bastler

Nach über einem Jahrzehnt musste ich meine Webcam neu aufsetzen. Der USB Speicherstick, auf dem die /root Partition lief, war verschlissen und unzuverlässig geworden. Immerhin – gut 12 Jahre hat er problemlos durchgehalten und dabei über 200.000 Aufnahmen verarbeitet. Die alte Webcam lief auf Raspbian Jessie – inzwischen komplett veraltet und aus der Wartung gefallen – Updates gibt es nicht mehr. Dasselbe Problem mit Python – bisher lief die Cam noch mit dem seligen Python 2.7.

Die Migration auf eine neue OS Version und einen neuen Python Interpreter ist kein Zuckerschlecken! Den Umgang mit einem wesentlichen Fallstrick zeige ich euch im Folgenden:

Migrationswehen

Also frisch ans Werk und mit Raspbian Bookworm und Python 3.x losgelegt. Praktisch alle Libraries waren veraltet und mussten neu installiert werden. Python 3.x hat auch stellenweise eine andere Syntax.

Die neue picamera2 Library ist grottig dokumentiert – das ist aber ein anderes Kapitel.

Ärgerlich wurde es bei der Installation von nicht zum Debian Kernel gehörenden Python Libraries wie der für den Luftdruck-, Temperatur-, Luftfeuchtigkeitssensor BME280:

Solltet ihr mit Raspberry Pi OS in der Version Bookworm arbeiten, wird der übliche Installationsbefehl für den BME280 fehlschlagen. Normalerweise wird der mit

sudo pip install RPI.BME280

installiert. Stattdessen gibt es einen Fehler der Art

510 error: externally managed environment

Das bedeutet im Grunde, neue Python Libraries aus anderen Quellen müssen in einer virtuellen Umgebung installiert werden. Dieser Fakt wird meistens nur apodiktisch postuliert: "Man macht das jetzt eben so!"

Es liegt wohl daran, dass einerseits Debian-hauseigene Komponenten bzw. Python Libraries mit sudo apt install python3-irgendEineLibrary  installiert werden, "fremde", also nicht zum Kernel gehörende, Python Libraries mit  sudo pip install irgendEineAndereLibrary .

apt und pip sind zwei verschiedene Paketverwaltungen, die nur ihre eigenen Abhängigkeiten (d.h. dazu gehörende Unterkomponenten) kennen. So kann es unter Umständen sein, dass pip igendwelche Komponenten zerschießt, die apt vorher installiert hat.

<begin rant> Man hätte natürlich bei der Weiterentwicklung von Debian und Python, den pip Paketmanager in die Abhängigkeiten von apt hineinschauen lassen können und vice versa. Aus meiner beruflichen Erfahrung weiß ich jedoch, dass SW Entwickler nichts so sehr hassen, wie sich mit Anderen abzustimmen – viel zu viel Aufwand, den man nicht bezahlt bekommt. Also anstatt das Gute zu tun, wird der Nutzer mit dem Python Enhancement Proposal 668 (PEP668) überzogen. Was für ein Bockmist! <end rant>

Overengineered?

Bei meinem Pi handelt es sich um einen Single User Server – der User bin ich und installiere als Einziger irgendwelche Libraries, Module, Treiber etc. Dazu kommt meist noch ein ein Maschinenuser (Programm wird aufgerufen und läuft) oder der Webserver. Es besteht also meines Erachtens nur eine geringe Gefahr dass ich Anderen etwas durch die Installation von Python Libraries zerschieße. Bei größeren Multiuser (Entwicklungs-)Servern oder mit mächtigen Python-Applikationen bestückten Servern macht es sicher Sinn, die einzelnen vom Root User installierten Komponenten voneinander zu trennen. Bei einem Raspberry Pi als Bastelrechner imho nicht!

Wer will, kann sich natürlich intensiver mit dem Python Virtual Environment beschäftigen – ich lasse es für den Zweck meines Blogs sein und zeige lieber auf, wie man diese Verkomplizierung umgeht. Profi SW Entwickler mögen mir verzeihen oder mir genau erklären, warum ich Python virtualisieren sollte.

Die beste Erklärung bzw. Anleitung findet sich bei  piMyLifeUp aber auch bei Stackoverflow, dort steht auch, wie man mit der virtuellen Umgebung umgeht. Aber hier wollen wir ja das Gegenteil davon.

Der Quick & Dirty Ansatz für risikofreudige Hobbyisten

Beachtet dennoch folgenden Hinweis von Stackoverflow:

"If you have considered your options carefully and are still sure that you want to install packages "system-wide" and risk breaking your system (for example, by overwriting libraries that were part of tools written in Python that came with your system), Pip needs to be given permission to do so."

Für risikofreudige Bastler wird die Library wird dann wie folgt installieren:

sudo pip install RPI.BME280 --break-system-packages

Python kann dann nach wie vor direkt von der Shell aus aufgerufen werden – ohne irgendwelche Klimmzüge wie ich sie in meinem Beitrag über den Optolink Splitter beschrieben habe.

Keine Angst! Wahrscheinlichkeit, etwas kaputt zu machen ist ziemlich gering…

Schreibe einen Kommentar

Ich freue mich über Lob und Kritik.
Falls du Probleme mit der hier vorgestellten Anleitung hast und nicht weiter kommst:
Bitte das Problem oder die Fehlermeldung(en) möglichst genau beschreiben, auch an welcher Stelle (z.B. in welchem Node oder Befehl) und unter welchen Umständen der Fehler auftritt.
Gerne kannst du mir auch ein Mail schreiben. Die Adresse findest du im Impressum.
Ich gebe mir viel Mühe, meinen Lesern weiterzuhelfen. Je konkreter du bist, desto einfacher und schneller kann ich versuchen zu helfen.
Deine E-Mail-Adresse wird nicht veröffentlicht.
Erforderliche Felder sind mit * markiert