Vai al contenuto
QGIS
Risoluzione dei problemi

QGIS: DLL load failed importing _gdal [Risolto]

Pubblicato il Aggiornato il

ImportError: DLL load failed while importing _gdal interrompe qualsiasi Python che esegua from osgeo import gdal dentro QGIS su Windows, incluso Processing Toolbox. Una seconda copia di GDAL precede quella di QGIS nel PATH, quindi rimuovi dal PATH le cartelle non-QGIS, poi esegui il logout da Windows e accedi di nuovo. Sulla maggior parte dei computer questa è tutta la correzione necessaria, e le quattro successive coprono il resto.

ImportError: DLL load failed while importing _gdal: The specified module could not be found.

On Windows, with Python >= 3.8, DLLs are no longer imported from the PATH.
If gdalXXX.dll is in the PATH, then set the USE_PATH_FOR_GDAL_PYTHON=YES environment variable
to feed the PATH into os.add_dll_directory().

GDAL ha rimosso questo suggerimento di tre righe nella versione 3.7.0, quindi nelle installazioni attuali ottieni solo la prima riga. Su alcuni computer cambia una parola, ma la causa è la stessa:

ImportError: DLL load failed while importing _gdal: The specified procedure could not be found.

La maggior parte delle persone non legge nessuna delle due formulazioni. Incontra il problema come una singola riga nel pannello QGIS Log Messages e come un Processing menu vuoto:

Couldn't load plugin 'processing'

Si applica a Windows, QGIS 3.16 e versioni successive, e a qualsiasi Python 3.8 o successivo che esegua from osgeo import gdal.

La correzione rapida

Elenca ogni cartella del PATH che contiene una DLL GDAL

Apri OSGeo4W Shell dalla cartella QGIS nel Start menu ed esegui questo comando, che ripete la logica usata da GDAL:

python -c "import os,glob;print('\n'.join(p for p in os.environ['PATH'].split(';') if p and (glob.glob(os.path.join(p,'gdal*.dll')) or glob.glob(os.path.join(p,'libgdal*.dll')))))"

Leggi la prima riga. È la cartella scelta da GDAL e dovrebbe trovarsi dentro l'installazione di QGIS. Conserva tutto l'output, perché ogni correzione successiva lo utilizza.

Elimina le voci che non appartengono a QGIS

Anaconda, Miniconda, una seconda installazione di QGIS o OSGeo4W, un altro pacchetto GIS. Apri Start, digita "environment variables", apri Edit the system environment variables, poi Environment Variables, quindi Path, ed elimina quelle voci. Esegui il logout da Windows e accedi di nuovo.

Avvia QGIS dal suo collegamento

Non da una shell in cui hai già eseguito lo script activate di un altro ambiente. Una shell che mette per prima una cartella gdal-dev la passa direttamente a QGIS.

Verifica che abbia funzionato

In QGIS, apri Plugins, then Python Console, ed esegui:

from osgeo import gdal
print(gdal.__version__)

Un numero di versione senza traceback sopra di esso significa che sono state caricate le DLL corrette. Apri anche Processing menu, perché Toolbox ricompare non appena il plugin processing riesce a importare GDAL, e un Processing menu vuoto significa che il problema non è ancora risolto.

Correzione 2: esegui lo script nell'ambiente QGIS

Il passaggio 1 non ha stampato nulla. Nessuna cartella del PATH contiene una DLL GDAL, quindi non è stata registrata alcuna DLL. Succede quando un python.exe semplice o una configurazione di esecuzione di PyCharm viene avviata al di fuori dell'ambiente QGIS. Esegui lo script in OSGeo4W Shell oppure tramite python-qgis.bat nella cartella bin di QGIS. In un'installazione long term release il file si chiama python-qgis-ltr.bat. Entrambi registrano la cartella DLL corretta prima dell'avvio di Python.

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

Correzione 3: ripara un'installazione OSGeo4W aggiornata parzialmente

Il passaggio 1 ha stampato diverse righe e tutte si trovano nello stesso albero OSGeo4W. Stai utilizzando sia gdal sia gdal-dev dopo un aggiornamento interrotto a metà. Esegui nuovamente l'installer OSGeo4W e reinstalla i pacchetti gdal e qgis, oppure reinstalla QGIS tramite lo standalone installer, che è il modo più rapido per uscire dal problema.

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

Correzione 4: imposta USE_PATH_FOR_GDAL_PYTHON

Il passaggio 1 ha stampato una sola riga, quella di QGIS, ma l'import continua a non funzionare. Ora vale la pena provare la variabile, e solo ora. In QGIS: Settings, then Options, then System, then Environment. Seleziona la casella delle variabili personalizzate, aggiungi questo nome e valore, quindi riavvia QGIS:

USE_PATH_FOR_GDAL_PYTHON=YES

Aiuta una piccola minoranza di persone, per il motivo spiegato nella sezione "Perché succede".

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

Correzione 5: mantieni un solo GDAL per ambiente conda

Il tuo GDAL proviene da conda. Usalo solo da conda-forge, in un ambiente nuovo, e non inserire mai una wheel GDAL di pip nello stesso ambiente. Un canale, una copia.

Se l'errore non cambia, inviami le tre informazioni indicate sotto.

Perché succede

Python 3.8 ha smesso di cercare le DLL delle estensioni nel PATH. GDAL aggira il problema in osgeo/__init__.py. Con USE_PATH_FOR_GDAL_PYTHON non impostata, GDAL legge PATH in ordine, registra con os.add_dll_directory() la prima cartella che contiene una gdal*.dll o libgdal*.dll, quindi smette di cercare. Vince quindi il primo GDAL presente nel PATH e, quando quella copia non è quella di QGIS, le sue DLL non corrispondono al modulo _gdal con cui è stato compilato QGIS.

Impostare la variabile amplia la ricerca invece di restringerla, perché GDAL registra allora ogni cartella del PATH e non usa alcun glob. La riga che il messaggio di errore stampava in passato aiuta quindi quasi nessuno.

Il nostro AI Segmentation plugin legge i raster tramite il GDAL già distribuito da QGIS e non ne installa uno proprio, quindi funziona non appena l'import precedente riesce. Il resto di ciò che sviluppiamo per QGIS si trova nella pagina QGIS AI.

Ancora non funziona?

Inviami tre informazioni: la tua versione di QGIS, il traceback completo e l'output del controllo del PATH dal passaggio 1 della correzione rapida. Il mio indirizzo è stephane.barbot@terra-lab.ai. Di solito la prima riga di quell'output è sufficiente per capire in quale dei cinque casi ti trovi.

Domande frequenti

Perché il mio errore non menziona USE_PATH_FOR_GDAL_PYTHON?

GDAL ha rimosso le tre righe di suggerimento nella versione 3.7.0, quindi le versioni attuali stampano solo la prima riga e nient'altro. La causa non è cambiata. La correzione è la stessa che avresti applicato con la versione 3.6.

Impostare USE_PATH_FOR_GDAL_PYTHON=YES risolve il problema?

Raramente, ed è la Correzione 4 invece della Correzione 1 per un motivo preciso. La variabile fa registrare a GDAL ogni cartella del PATH invece della prima che contiene una DLL GDAL, quindi amplia la ricerca invece di indirizzarla verso QGIS. Provala dopo che il PATH mostra una sola cartella GDAL e l'import continua a non funzionare.

Perché il mio Processing Toolbox è scomparso nello stesso momento?

Il plugin processing importa GDAL, quindi non può essere caricato, e QGIS scrive "Couldn't load plugin 'processing'" nel pannello Log Messages. Toolbox ricompare automaticamente quando l'import funziona, rendendolo il modo più rapido per verificare se una correzione è andata a buon fine.

E se il traceback indica _C invece di _gdal?

È un modulo diverso e richiede una correzione diversa. Ha un articolo dedicato: DLL load failed while importing _C.