{"id":3386,"date":"2025-03-10T11:55:23","date_gmt":"2025-03-10T10:55:23","guid":{"rendered":"https:\/\/www.rustimation.eu\/?p=3386"},"modified":"2025-08-17T10:09:52","modified_gmt":"2025-08-17T08:09:52","slug":"python-das-externally-managed-environment-problem","status":"publish","type":"post","link":"https:\/\/www.rustimation.eu\/index.php\/python-das-externally-managed-environment-problem\/","title":{"rendered":"Python &#8211; Das Externally Managed Environment Problem"},"content":{"rendered":"<h2>oder Profi vs. Bastler<\/h2>\n<p>Nach \u00fcber einem Jahrzehnt musste ich meine Webcam neu aufsetzen. Der USB Speicherstick, auf dem die \/root Partition lief, war verschlissen und unzuverl\u00e4ssig geworden. Immerhin &#8211; gut 12 Jahre hat er problemlos durchgehalten und dabei \u00fcber 200.000 Aufnahmen verarbeitet. Die alte Webcam lief auf Raspbian Jessie &#8211; inzwischen komplett veraltet und aus der Wartung gefallen &#8211; Updates gibt es nicht mehr. Dasselbe Problem mit Python &#8211; bisher lief die Cam noch mit dem seligen Python 2.7.<\/p>\n<p>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:<\/p>\n<p><!--more--><\/p>\n<h3>Migrationswehen<\/h3>\n<p>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.<\/p>\n<p>Die neue picamera2 Library ist grottig dokumentiert &#8211; das ist aber ein anderes Kapitel.<\/p>\n<p>\u00c4rgerlich wurde es bei der Installation von nicht zum Debian Kernel geh\u00f6renden Python Libraries wie der f\u00fcr den Luftdruck-, Temperatur-, Luftfeuchtigkeitssensor <strong>BME280<\/strong>:<\/p>\n<p>Solltet ihr mit Raspberry Pi OS in der Version Bookworm oder sp\u00e4ter arbeiten, wird der \u00fcbliche Installationsbefehl f\u00fcr den BME280 fehlschlagen. Normalerweise wird der mit<\/p>\n<p><span class=\"lang:default decode:true crayon-inline \">sudo pip install RPI.BME280<\/span><\/p>\n<p>installiert. Stattdessen gibt es einen Fehler der Art<\/p>\n<p><span style=\"color: #ff0000;\">510 error<\/span>: externally managed environment<\/p>\n<h3>Virtuelle Python Umgebung<\/h3>\n<p>Das bedeutet im Grunde, neue Python Libraries aus anderen Quellen m\u00fcssen in einer <strong>virtuellen Umgebung installiert<\/strong> werden. Dieser Fakt wird meistens nur apodiktisch postuliert: \"Man macht das jetzt eben so!\"<\/p>\n<p>Es liegt wohl daran, dass einerseits Debian-hauseigene Komponenten bzw. Python Libraries mit <span class=\"lang:default decode:true crayon-inline\">sudo apt install python3-irgendEineLibrary<\/span>\u00a0 installiert werden, \"fremde\", also nicht zum Kernel geh\u00f6rende, Python Libraries mit\u00a0 <span class=\"lang:default decode:true crayon-inline \">sudo pip install irgendEineAndereLibrary<\/span>\u00a0.<\/p>\n<p><strong>apt<\/strong> und <strong>pip<\/strong> sind zwei verschiedene Paketverwaltungen, die nur ihre eigenen Abh\u00e4ngigkeiten (d.h. dazu geh\u00f6rende Unterkomponenten) kennen. So kann es unter Umst\u00e4nden sein, dass pip igendwelche Komponenten zerschie\u00dft, die apt vorher installiert hat oder zum Standard Installationsumfang der Distribution geh\u00f6ren.<\/p>\n<p style=\"padding-left: 40px;\"><span style=\"color: #808080;\">&lt;rant&gt; Man h\u00e4tte nat\u00fcrlich bei der Weiterentwicklung von Debian und Python, den pip Paketmanager in die Abh\u00e4ngigkeiten von apt hineinschauen lassen k\u00f6nnen und vice versa. Aus meiner beruflichen Erfahrung wei\u00df ich jedoch, dass SW Entwickler nichts so sehr hassen, wie sich mit Anderen abzustimmen &#8211; viel zu viel Aufwand, den man nicht bezahlt bekommt. Also anstatt das Gute zu tun, wird der Nutzer mit dem Python Enhancement Proposal 668 (<a style=\"color: #808080;\" href=\"https:\/\/peps.python.org\/pep-0668\/\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #ff0000;\">PEP668<\/span><\/a>) \u00fcberzogen. Was f\u00fcr ein Bockmist! &lt;\/rant&gt;<\/span><\/p>\n<p>Und nicht nur das, dein Python Programm muss hinterher jedes Mal umst\u00e4ndlich in der virtuellen Umgebung gestartet und betrieben werden. Wenn ich eine virtuelle Umgebung gewollt h\u00e4tte, w\u00e4re ich auf Docker o.\u00e4. umgestiegen.<\/p>\n<h3>Overengineered?<\/h3>\n<p>Bei meinem Pi handelt es sich um einen Single User Server \u2013 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\u00e4uft) oder der Webserver. Es besteht also meines Erachtens nur eine geringe Gefahr dass ich Anderen etwas durch die Installation von Python Libraries zerschie\u00dfe. Bei gr\u00f6\u00dferen Multiuser (Entwicklungs-)Servern oder mit m\u00e4chtigen Python-Applikationen best\u00fcckten Servern macht es sicher Sinn, die einzelnen vom Root User installierten Komponenten voneinander zu trennen. Bei einem Raspberry Pi als Bastelrechner imho nicht! Debian (Raspberry Pi OS) scheint auch weniger empfindlich zu sein. Ich habe geh\u00f6rt, dass pip bei Fedora Distributionen z.B. wesentlich kritischer ist.<\/p>\n<p>Wer will, kann sich nat\u00fcrlich intensiver mit dem Python Virtual Environment besch\u00e4ftigen \u2013 ich lasse es f\u00fcr den Zweck meines Blogs sein und zeige lieber auf, wie man diese Verkomplizierung umgeht. Profi SW Entwickler m\u00f6gen mir verzeihen oder mir genau erkl\u00e4ren, warum ich Python unter Debian\/Raspbian\u00a0 virtualisieren sollte.<\/p>\n<p>Gute Erkl\u00e4rungen bzw. Anleitungen finden sich bei\u00a0 <a href=\"https:\/\/pimylifeup.com\/python-externally-managed-environment\/\" target=\"_blank\" rel=\"noopener\">piMyLifeUp<\/a> aber auch bei <a href=\"https:\/\/stackoverflow.com\/questions\/75608323\/how-do-i-solve-error-externally-managed-environment-every-time-i-use-pip-3#75722775\" target=\"_blank\" rel=\"noopener\">Stackoverflow<\/a>, dort steht auch, wie man mit der virtuellen Umgebung umgeht. Aber hier wollen wir ja das Gegenteil davon.<\/p>\n<h3>Erstmal andersrum probieren<\/h3>\n<p>Will man beispielsweise die MQTT Library <em>paho-mqtt <\/em>installieren, sagen einem die meisten Tutorials, man m\u00f6ge das mit<span class=\"lang:default decode:true crayon-inline \">sudo pip3 install paho-mqtt<\/span>\u00a0 installieren. Es geht aber auch \u00fcber apt: <span class=\"lang:default decode:true crayon-inline \">sudo apt install python3-paho-mqtt <\/span>\u00a0und man hat die oben beschriebenen Probleme nicht.<\/p>\n<p>Also im Zweifelsfall erst einmal mit <em>apt<\/em> probieren. Die Libraries sind ggf. nicht am <em>bleeding edge of the development<\/em> aber in der Regel v\u00f6llig ausreichend.<\/p>\n<h3>Der Quick &amp; Dirty Ansatz f\u00fcr risikofreudige Hobbyisten<\/h3>\n<p>Beachtet dennoch folgenden Hinweis von Stackoverflow:<\/p>\n<p><em>\"If you have considered your options carefully and are still sure that you want to install packages \"system-wide\" and <strong>risk breaking your system<\/strong> (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.\"<\/em><\/p>\n<p>Der risikofreudige Bastler wird die Library dann wie folgt installieren:<\/p>\n<p><span class=\"lang:default decode:true crayon-inline\">sudo pip install RPI.BME280 &#8211;break-system-packages<\/span><\/p>\n<p>Python kann dann nach wie vor direkt von der Shell aus aufgerufen werden &#8211; ohne irgendwelche Klimmz\u00fcge wie ich sie in meinem Beitrag <a href=\"https:\/\/www.rustimation.eu\/index.php\/viessmann-ohne-api-optolink-splitter-1\/#Optolink_Splitter_und_Python_Libraries\" target=\"_blank\" rel=\"noopener\">\u00fcber den Optolink Splitter <\/a>beschrieben habe.<\/p>\n<p>Keine Angst! Wahrscheinlichkeit, etwas kaputt zu machen ist ziemlich gering&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>oder Profi vs. Bastler Nach \u00fcber einem Jahrzehnt musste ich meine Webcam neu aufsetzen. Der USB Speicherstick, auf dem die \/root Partition lief, war verschlissen und unzuverl\u00e4ssig geworden. Immerhin &#8211; gut 12 Jahre hat er problemlos durchgehalten und dabei \u00fcber 200.000 Aufnahmen verarbeitet. Die alte Webcam lief auf Raspbian Jessie &#8211; inzwischen komplett veraltet und &hellip; <a href=\"https:\/\/www.rustimation.eu\/index.php\/python-das-externally-managed-environment-problem\/\" class=\"more-link\"><span class=\"screen-reader-text\">Python &#8211; Das Externally Managed Environment Problem<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,11,69],"tags":[212,211],"class_list":["post-3386","post","type-post","status-publish","format-standard","hentry","category-python","category-raspbian","category-tips-tricks","tag-bookworm","tag-pip-install"],"_links":{"self":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/3386","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/comments?post=3386"}],"version-history":[{"count":1,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/3386\/revisions"}],"predecessor-version":[{"id":3641,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/3386\/revisions\/3641"}],"wp:attachment":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/media?parent=3386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/categories?post=3386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/tags?post=3386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}