[Gelöst] No module named pip in QGIS Flatpak
Veröffentlicht am Aktualisiert am
Führen Sie pip über das Flatpak mit --devel aus und installieren Sie mit --user. Beide Flags sind notwendig: --devel tauscht die Laufzeitumgebung gegen das SDK aus, in dem pip tatsächlich vorhanden ist, und --user legt die Dateien in einem Verzeichnis ab, in das die Sandbox Schreibzugriff erlaubt.
/usr/bin/python3: No module named pip
bwrap: execvp pip3: No such file or directory
ERROR: Could not install packages due to an EnvironmentError:
[Errno 30] Read-only file system: '/usr/lib/python3.11/site-packages/urllib3-1.25.9.dist-info'
error: runtime/org.kde.Sdk/x86_64/5.15-22.08 not installed
Alle vier Zeilen stammen aus derselben Sandbox. Sie begegnen ihnen beim QGIS-Paket von Flathub, org.qgis.qgis, auf jeder Linux-Distribution, sobald ein Plugin nach einem Python-Paket fragt, das es nicht finden kann, und Sie pip so verwenden, wie Sie es bei jeder anderen Installation tun würden.
Die schnelle Lösung
Lesen Sie den SDK-Branch ab, den Ihr QGIS-Flatpak benötigt
Führen Sie flatpak info org.qgis.qgis aus und sehen Sie sich die Zeile Sdk: an. Sie enthält einen Namen und einen Branch, zum Beispiel org.kde.Sdk/x86_64/6.10. Notieren Sie den Branch. Kopieren Sie die Zahl nicht von dieser Seite oder aus Ihrer Fehlermeldung: Der Branch ändert sich mit jeder QGIS-Version.
Installieren Sie genau diesen Branch
flatpak install flathub org.kde.Sdk//6.10, wobei der Branch, den Sie gerade abgelesen haben, nach den beiden Schrägstrichen steht. Jeder andere Branch lässt sich sauber installieren und lässt Sie trotzdem ohne pip zurück.
Installieren Sie das Paket
flatpak run --devel --command=pip3 org.qgis.qgis install scipy --user
Ersetzen Sie scipy durch das Paket, das Ihr Plugin anfordert. Verwenden Sie ab jetzt bei jeder Installation beide Flags.
Prüfen Sie, ob es funktioniert
Starten Sie QGIS neu, öffnen Sie Erweiterungen > Python-Konsole und geben Sie import scipy ein. Ein leerer Prompt ist die gewünschte Antwort, denn das bedeutet, dass QGIS den Ordner liest, in dem Sie installiert haben, und Ihr Plugin das Paket dort ebenfalls findet. Ein ModuleNotFoundError bedeutet, dass die Dateien irgendwo gelandet sind, wo QGIS niemals sucht, unabhängig davon, was pip während der Installation ausgegeben hat.
Lösung 2: Die Dateien liegen außerhalb des QGIS-Suchpfads
Geben Sie das Verzeichnis aus, in das pip geschrieben hat:
flatpak run --command=python3 org.qgis.qgis -c "import site; print(site.getusersitepackages())"
Vergleichen Sie es mit sys.path in der Python-Konsole von QGIS. Wenn dieses Verzeichnis nicht in der Liste steht, wird dort nichts jemals importiert, egal wie sauber pip den Erfolg gemeldet hat. Das Installationsprotokoll sieht von Anfang bis Ende perfekt aus, und das Paket befindet sich tatsächlich auf der Festplatte, liegt aber außerhalb der Ordner, die diese Python-Umgebung beim Start liest.
Wenn der Fehler unverändert bleibt, gehen Sie zu Lösung 3.
Lösung 3: Das Paket kompiliert C-Erweiterungen
Sie erhalten mitten in der Installation einen Compilerfehler, keinen Python-Fehler. Das SDK enthält einen Compiler, aber nicht jeden benötigten Entwicklungs-Header, und Sie können keinen von außerhalb der Sandbox hineinreichen. Weisen Sie pip an, einen Quellcode-Build abzulehnen und stattdessen ein vorkompiliertes Wheel zu verwenden:
flatpak run --devel --command=pip3 org.qgis.qgis install scipy --user --only-binary=:all:
Wenn es für Ihre Plattform kein Wheel gibt, suchen Sie nach einem Paket, das eines veröffentlicht.
Wenn der Fehler unverändert bleibt, gehen Sie zu Lösung 4.
Lösung 4: pip3 fehlt auch mit --devel weiterhin
Die SDK-Installation wurde nicht übernommen. Bestätigen Sie den Branch mit flatpak list | grep Sdk und bauen Sie pip anschließend als Fallback innerhalb der Sandbox:
flatpak run --command=python3 org.qgis.qgis -m ensurepip --upgrade --user
Betrachten Sie das ausschließlich als Fallback. Keine Quelle empfiehlt es an dieser Stelle, und ohne --devel läuft es gegen die Platform-Laufzeitumgebung statt gegen das SDK. Gehen Sie danach zu Schritt 3 der schnellen Lösung zurück.
Wenn der Fehler unverändert bleibt, gehen Sie zu Lösung 5.
Lösung 5: Sie verwenden nicht den Flathub-Build
Prüfen Sie dies mit flatpak info org.qgis.qgis. Wenn dieser Befehl nichts zurückgibt, stammt Ihr QGIS von einer anderen Quelle und keiner der obigen Befehle gilt dafür. QGIS bietet kein offizielles Snap-Paket, daher stammt ein Snap-Build von einem Drittanbieter und hat eigene Sandbox-Regeln. Installieren Sie QGIS unter Debian und Ubuntu stattdessen aus dem offiziellen QGIS-Repository, nicht über Flathub. QGIS verwendet dann die System-Python-Umgebung, und Plugin-Abhängigkeiten werden mit gewöhnlichem pip installiert.
Wenn der Fehler unverändert bleibt, senden Sie ihn mir. Im folgenden Abschnitt steht, was Sie in die E-Mail aufnehmen sollten.
Warum das passiert
Das Flatpak enthält eine eigene Python-Umgebung, die von der Ihrer Distribution abgeschottet ist. Deshalb ist ein Paket, das Sie mit dem System-pip oder mit apt hinzugefügt hast, für QGIS unsichtbar. Innerhalb der Sandbox ist /usr schreibgeschützt eingehängt. Ein einfaches pip install versucht, dorthin zu schreiben. Das erzeugt die Zeile [Errno 30] mit dem darin enthaltenen python3.11-Pfad, während --user dieselben Dateien stattdessen in ein beschreibbares Verzeichnis legt.
pip selbst befindet sich im SDK, nicht in der Laufzeitumgebung, die QGIS normalerweise startet. Ohne --devel gibt es überhaupt kein pip3, das ausgeführt werden könnte. Daher stammt die Meldung von bwrap und nicht von Python. Außerdem funktioniert --devel nur, wenn das passende SDK bereits auf Ihrem Rechner installiert ist. Genau das teilt Ihnen die letzte Zeile des Fehlerblocks mit.
Unser Plugin AI Segmentation erkennt ein Flatpak-QGIS und verweist Sie auf den Modus Automatisch. Dieser läuft auf unseren Servern und installiert kein Python-Paket auf Ihrem Rechner.
Immer noch fehlerhaft?
Senden Sie mir drei Dinge: die Version Ihres Flatpak-QGIS aus flatpak info org.qgis.qgis, den exakten Befehl, den Sie ausgeführt haben, und die vollständige Ausgabe statt nur deren letzter Zeile. Die Adresse lautet stephane.barbot@terra-lab.ai. Wenn es um das Paket geht, das unser Plugin AI Segmentation angefordert hat, erwähnen Sie das in der E-Mail, weil sich dadurch ändert, welche der fünf Lösungen ich zuerst prüfe.
Häufige Fragen
Warum funktioniert pip in meinem Terminal, aber nicht in QGIS?
Das pip Ihres Terminals gehört zur Python-Umgebung, die Ihre Distribution installiert hat. Das Flatpak verwendet eine eigene Umgebung, und keine der beiden kann die Pakete der jeweils anderen sehen. Deshalb lassen apt und das System-pip QGIS genau dort, wo es vorher war. Jede Installation muss über flatpak run erfolgen, wodurch sie innerhalb der Sandbox ausgeführt wird.
Brauche ich --devel bei jeder Installation?
Ja. pip3 befindet sich im SDK und nicht in der Laufzeitumgebung, die QGIS startet. Ohne --devel gibt es also nichts auszuführen. Verwenden Sie außerdem bei jeder Installation --user, sonst schreiben Sie erneut in ein schreibgeschütztes /usr und erhalten wieder die Zeile [Errno 30].
Wo landen die Pakete tatsächlich?
Im benutzerspezifischen Site-Verzeichnis innerhalb der Sandbox. Der Befehl in Lösung 2 gibt dieses Verzeichnis aus. Vergleichen Sie den Pfad mit sys.path in der Python-Konsole von QGIS. Dateien außerhalb sämtlicher Ordner dieser Liste wird QGIS niemals importieren.
Gibt es einen offiziellen QGIS-Snap, den ich stattdessen verwenden könnte?
Nein. snapcraft.io/qgis gibt einen 404-Fehler zurück, und der Build im Snap Store stammt von einem Drittanbieter. Die QGIS-Dokumentation führt Flatpak, Distributionspakete und Spack auf. Unter Debian oder Ubuntu ist die Alternative zu Flathub daher das offizielle QGIS-Repository und nicht Snap.
Sobald die Importe funktionieren, können Sie zu den Plugins zurückkehren. Unsere beiden finden Sie im QGIS AI hub. Für Windows gibt es eine eigene Version dieses Problems, die in ImportError: DLL load failed while importing _C in QGIS beschrieben wird.


