Vai al contenuto
QGIS
Risoluzione dei problemi

QGIS Flatpak: No module named pip, Read-only [Risolto]

Pubblicato il Aggiornato il

Esegui pip tramite Flatpak con --devel e installa con --user. Entrambi i flag sono necessari: --devel sostituisce il runtime con l'SDK, dove pip è effettivamente disponibile, mentre --user invia i file in una directory in cui la sandbox consente di scrivere.

/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

Tutte e quattro le righe provengono dalla stessa sandbox. Le incontri nel pacchetto QGIS di Flathub, org.qgis.qgis, su qualsiasi distribuzione Linux, nel momento in cui un plugin richiede un pacchetto Python che non riesce a trovare e cerchi pip come faresti con qualsiasi altra installazione.

La soluzione rapida

Leggi il ramo SDK richiesto dal tuo Flatpak QGIS

Esegui flatpak info org.qgis.qgis e cerca la riga Sdk:. Fornisce un nome e un ramo, come org.kde.Sdk/x86_64/6.10. Annota il ramo. Non copiare il numero da questa pagina o dal messaggio di errore: il ramo cambia con ogni release di QGIS.

Installa quel ramo esatto

flatpak install flathub org.kde.Sdk//6.10, usando il ramo appena letto dopo le due barre. Qualsiasi altro ramo si installa correttamente e ti lascia comunque senza pip.

Installa il pacchetto

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

Sostituisci scipy con qualunque pacchetto richiesto dal tuo plugin. Mantieni entrambi i flag in ogni installazione che eseguirai d'ora in poi.

Verifica che abbia funzionato

Riavvia QGIS, apri Plugins, poi Python Console, e digita import scipy. Un prompt vuoto al ritorno è il risultato che vuoi, perché significa che QGIS legge la cartella in cui hai installato il pacchetto e che anche il tuo plugin lo troverà lì. Un ModuleNotFoundError significa che i file sono finiti in una posizione che QGIS non cerca mai, indipendentemente da ciò che pip ha stampato durante l'installazione.

Correzione 2: i file sono finiti fuori dal percorso di ricerca di QGIS

Stampa la directory in cui pip ha scritto:

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

Confrontala con sys.path nella QGIS Python Console. Se quella directory non è nell'elenco, nulla di ciò che vi è installato verrà mai importato, per quanto pip abbia segnalato correttamente il successo. Il log di installazione sembra perfetto dall'inizio alla fine e il pacchetto è davvero sul disco, semplicemente fuori dall'insieme di cartelle che questo Python legge all'avvio.

Se l'errore non cambia, passa alla Correzione 3.

Correzione 3: il pacchetto compila estensioni C

Durante l'installazione ricevi un errore del compilatore, non un errore Python. L'SDK include un compilatore, ma non tutte le intestazioni di sviluppo, e non puoi fornirgliene una dall'esterno della sandbox. Di' a pip di rifiutare una build dal sorgente e di usare invece una wheel precompilata:

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

Se non esiste una wheel per la tua piattaforma, cerca un pacchetto che ne pubblichi una.

Se l'errore non cambia, passa alla Correzione 4.

Correzione 4: pip3 manca ancora anche con --devel

L'installazione dell'SDK non è andata a buon fine. Conferma il ramo con flatpak list | grep Sdk, poi crea pip all'interno della sandbox come soluzione alternativa:

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

Considerala solo una soluzione alternativa. Nessuna fonte la raccomanda in questo caso e, senza --devel, viene eseguita sul runtime Platform invece che sull'SDK. Torna poi al passaggio 3 della soluzione rapida.

Se l'errore non cambia, passa alla Correzione 5.

Correzione 5: non stai usando la build di Flathub

Controlla con flatpak info org.qgis.qgis. Se non restituisce nulla, il tuo QGIS proviene da un'altra fonte e nessuno dei comandi precedenti si applica. QGIS non distribuisce alcun pacchetto Snap ufficiale, quindi una build Snap proviene da terzi e segue le proprie regole di sandbox. Su Debian e Ubuntu, installa dal repository ufficiale di QGIS invece che da Flathub. QGIS utilizzerà quindi il Python di sistema e le dipendenze dei plugin si installeranno con il normale pip.

Se l'errore non cambia, mandamelo e la sezione seguente indica cosa includere nell'email.

Perché succede

Flatpak contiene un proprio Python, isolato da quello installato dalla tua distribuzione, quindi un pacchetto aggiunto con il pip di sistema o con apt è invisibile a QGIS. All'interno della sandbox, /usr è montato in sola lettura. Un normale pip install cerca di scrivere lì, producendo la riga [Errno 30] con il percorso python3.11, mentre --user invia gli stessi file a una directory scrivibile.

pip si trova nell'SDK, non nel runtime avviato normalmente da QGIS. Senza --devel non esiste alcun pip3 da eseguire, quindi il messaggio di errore proviene da bwrap invece che da Python. Inoltre, --devel funziona solo quando l'SDK corrispondente è già presente sul computer, come indica l'ultima riga del blocco degli errori.

Il nostro plugin AI Segmentation riconosce un QGIS Flatpak e ti indirizza alla modalità Automatic, che viene eseguita sui nostri server e non installa alcun pacchetto Python sul tuo computer.

Ancora non funziona?

Mandami tre cose: la versione del tuo QGIS Flatpak ottenuta da flatpak info org.qgis.qgis, il comando esatto che hai eseguito e il suo output completo, non solo l'ultima riga. L'indirizzo è stephane.barbot@terra-lab.ai. Se il pacchetto che stai cercando è stato richiesto dal nostro plugin AI Segmentation, indicalo nell'email, perché questo cambia quale delle cinque correzioni esamino per prima.

Domande frequenti

Perché pip funziona nel mio terminale ma non in QGIS?

Il pip del tuo terminale appartiene al Python installato dalla tua distribuzione. Flatpak ne usa uno proprio e nessuno dei due può vedere i pacchetti dell'altro, quindi apt e il pip di sistema lasciano QGIS esattamente com'era. Ogni installazione deve passare da flatpak run, che la inserisce nella sandbox.

Devo usare --devel a ogni installazione?

Sì. pip3 si trova nell'SDK, non nel runtime avviato da QGIS, quindi senza --devel non c'è nulla da eseguire. Mantieni anche --user in ogni installazione, altrimenti scriverai di nuovo in /usr, che è di sola lettura, e riceverai nuovamente la riga [Errno 30].

Dove finiscono esattamente i pacchetti?

Nella directory site per utente all'interno della sandbox, che il comando nella Correzione 2 stampa per te. Confronta quel percorso con sys.path nella QGIS Python Console. I file che si trovano fuori da ogni cartella dell'elenco non verranno mai importati da QGIS.

Esiste un QGIS Snap ufficiale che potrei usare?

No. snapcraft.io/qgis restituisce 404 e la build nello Snap store è di terze parti. La documentazione di QGIS elenca Flatpak, i pacchetti della distribuzione e Spack, quindi su Debian o Ubuntu l'alternativa a Flathub è il repository ufficiale di QGIS, non Snap.

Quando gli import funzionano puoi tornare ai plugin, e i nostri due vivono nell'hub QGIS AI. Windows ha una propria versione di questo problema, descritta in ImportError: DLL load failed while importing _C in QGIS.