Przejdź do treści
QGIS
Rozwiązywanie problemów

QGIS Flatpak: No module named pip (Rozwiązane)

Opublikowano Zaktualizowano

Uruchom pip przez Flatpak z --devel i instaluj z --user. Oba przełączniki są potrzebne: --devel zamienia środowisko uruchomieniowe na SDK, w którym faktycznie znajduje się pip, a --user kieruje pliki do katalogu, w którym piaskownica pozwala na zapis.

/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

Wszystkie cztery wiersze pochodzą z tej samej piaskownicy. Pojawiają się w pakiecie QGIS z Flathub, org.qgis.qgis, na dowolnej dystrybucji Linuxa, gdy plugin prosi o pakiet Pythona, którego nie może znaleźć, a Ty sięgasz po pip tak, jak na każdej innej instalacji.

Szybka poprawka

Odczytaj gałąź SDK wymaganą przez QGIS Flatpak

Uruchom flatpak info org.qgis.qgis i sprawdź wiersz Sdk:. Zawiera nazwę i gałąź, na przykład org.kde.Sdk/x86_64/6.10. Zapisz gałąź. Nie kopiuj numeru z tej strony ani z komunikatu o błędzie: gałąź zmienia się przy każdym wydaniu QGIS.

Zainstaluj dokładnie tę gałąź

flatpak install flathub org.kde.Sdk//6.10, używając gałęzi odczytanej przed podwójnym ukośnikiem. Każda inna gałąź zainstaluje się poprawnie, ale nadal pozostawi Cię bez pip.

Zainstaluj pakiet

flatpak run --devel --command=pip3 org.qgis.qgis install scipy --user

Zamień scipy na pakiet wymagany przez Twój plugin. Od teraz używaj obu przełączników przy każdej instalacji.

Sprawdź, czy zadziałało

Uruchom ponownie QGIS, otwórz Plugins, następnie Python Console i wpisz import scipy. Pusty prompt po wykonaniu polecenia jest tym, czego potrzebujesz, ponieważ oznacza, że QGIS odczytuje folder, do którego zainstalowano pakiet, a Twój plugin również go tam znajdzie. ModuleNotFoundError oznacza, że pliki trafiły w miejsce, którego QGIS nigdy nie przeszukuje, niezależnie od tego, co pip wypisał podczas instalacji.

Poprawka 2: pliki trafiły poza ścieżkę wyszukiwania QGIS

Wyświetl katalog, do którego pip zapisał pliki:

flatpak run --command=python3 org.qgis.qgis -c "import site; print(site.getusersitepackages())"

Porównaj go z sys.path w Python Console QGIS. Jeśli tego katalogu nie ma na liście, nic, co zostało tam zainstalowane, nigdy się nie zaimportuje, niezależnie od tego, jak poprawnie pip zgłosił sukces. Dziennik instalacji wygląda idealnie od początku do końca, a pakiet naprawdę znajduje się na dysku, tylko poza zestawem folderów odczytywanych przez ten Python podczas uruchamiania.

Jeśli błąd się nie zmienił, przejdź do poprawki 3.

Poprawka 3: pakiet kompiluje rozszerzenia C

W połowie instalacji pojawia się błąd kompilatora, a nie błąd Pythona. SDK zawiera kompilator, ale nie każdy nagłówek programistyczny, a z zewnątrz piaskownicy nie możesz mu go przekazać. Powiedz pip, aby odrzucił kompilację ze źródeł i zamiast tego użył gotowego wheel:

flatpak run --devel --command=pip3 org.qgis.qgis install scipy --user --only-binary=:all:

Jeśli dla Twojej platformy nie istnieje wheel, poszukaj pakietu, który go publikuje.

Jeśli błąd się nie zmienił, przejdź do poprawki 4.

Poprawka 4: pip3 nadal nie jest dostępny nawet z --devel

Instalacja SDK się nie powiodła. Potwierdź gałąź za pomocą flatpak list | grep Sdk, a następnie zbuduj pip wewnątrz piaskownicy jako rozwiązanie awaryjne:

flatpak run --command=python3 org.qgis.qgis -m ensurepip --upgrade --user

Traktuj to wyłącznie jako rozwiązanie awaryjne. Żadne źródło nie zaleca tutaj ensurepip, a bez --devel polecenie działa w środowisku uruchomieniowym Platform, a nie w SDK. Następnie wróć do kroku 3 szybkiej poprawki.

Jeśli błąd się nie zmienił, przejdź do poprawki 5.

Poprawka 5: nie korzystasz z kompilacji Flathub

Sprawdź za pomocą flatpak info org.qgis.qgis. Jeśli polecenie nic nie zwróci, Twój QGIS pochodzi z innego źródła i żadne z powyższych poleceń nie będzie miało zastosowania. QGIS nie udostępnia oficjalnego pakietu Snap, więc kompilacja Snap pochodzi od zewnętrznego dostawcy i ma własne zasady piaskownicy. Na Debianie i Ubuntu zainstaluj QGIS z oficjalnego repozytorium QGIS zamiast z Flathub. QGIS będzie wtedy używać systemowego Pythona, a zależności pluginów zainstalujesz zwykłym pip.

Jeśli błąd się nie zmienił, wyślij go do mnie, a poniższa sekcja wyjaśnia, co zawrzeć w wiadomości.

Dlaczego tak się dzieje

Flatpak ma własnego Pythona, odizolowanego od tego zainstalowanego przez Twoją dystrybucję, więc pakiet dodany za pomocą systemowego pip lub apt jest niewidoczny dla QGIS. W piaskownicy /usr jest zamontowany tylko do odczytu. Zwykłe pip install próbuje tam zapisywać, co powoduje wiersz [Errno 30] ze ścieżką python3.11, a --user kieruje te same pliki do zapisywalnego katalogu.

Sam pip znajduje się w SDK, a nie w środowisku uruchomieniowym, z którego QGIS zwykle startuje. Bez --devel nie ma w ogóle pip3, które można uruchomić, więc skarga pochodzi z bwrap, a nie z Pythona. --devel działa również tylko wtedy, gdy pasujące SDK znajduje się już na komputerze, co wyjaśnia ostatni wiersz bloku błędów.

Nasz AI Segmentation plugin rozpoznaje QGIS w Flatpak i kieruje Cię do trybu Automatic, który działa na naszych serwerach i nie instaluje żadnego pakietu Pythona na Twoim komputerze.

Nadal nie działa?

Wyślij mi trzy rzeczy: wersję QGIS Flatpak z flatpak info org.qgis.qgis, dokładne polecenie, które uruchomiłeś, oraz pełny wynik, a nie tylko jego ostatni wiersz. Adres to stephane.barbot@terra-lab.ai. Jeśli pakiet, którego szukasz, był wymagany przez nasz AI Segmentation plugin, napisz o tym w wiadomości, ponieważ zmienia to kolejność sprawdzania pięciu powyższych poprawek.

Pytania zadawane najczęściej

Dlaczego pip działa w moim terminalu, ale nie w QGIS?

Pip w Twoim terminalu należy do Pythona zainstalowanego przez dystrybucję. Flatpak ma własnego Pythona i żaden z nich nie widzi pakietów drugiego, więc apt i systemowy pip pozostawiają QGIS dokładnie w takim stanie, jak wcześniej. Każda instalacja musi przechodzić przez flatpak run, ponieważ to właśnie umieszcza ją w piaskownicy.

Czy muszę używać --devel przy każdej instalacji?

Tak. pip3 znajduje się w SDK, a nie w środowisku uruchomieniowym, z którego korzysta QGIS, więc bez --devel nie ma czego uruchomić. Przy każdej instalacji używaj również --user, inaczej ponownie zapiszesz do /usr tylko do odczytu i znów pojawi się wiersz [Errno 30].

Gdzie faktycznie trafiają pakiety?

Do katalogu site dla użytkownika wewnątrz piaskownicy. Wyświetla go polecenie z poprawki 2. Porównaj tę ścieżkę z sys.path w Python Console QGIS. Pliki znajdujące się poza każdym folderem z tej listy nigdy nie zostaną zaimportowane przez QGIS.

Czy istnieje oficjalny QGIS Snap, którego mogę użyć zamiast tego?

Nie. snapcraft.io/qgis zwraca 404, a kompilacja w sklepie Snap pochodzi od zewnętrznego dostawcy. Dokumentacja QGIS wymienia Flatpak, pakiety dystrybucji i Spack, więc na Debianie lub Ubuntu alternatywą dla Flathub jest oficjalne repozytorium QGIS, a nie Snap.

Gdy importy zaczną działać, możesz wrócić do pluginów. Nasze dwa pluginy znajdziesz na QGIS AI hub. Windows ma własną wersję tego problemu, opisaną w ImportError: DLL load failed while importing _C in QGIS.