Aller au contenu
QGIS
Dépannage

QGIS : corriger l’erreur DLL sur _gdal

Publié le Mis à jour le

ImportError: DLL load failed while importing _gdal bloque tout Python qui exécute from osgeo import gdal dans QGIS sous Windows, y compris la Processing Toolbox. Une deuxième copie de GDAL se trouve plus tôt dans votre PATH que celle de QGIS. Retirez donc ces dossiers qui ne sont pas liés à QGIS de PATH, puis déconnectez-vous de Windows et reconnectez-vous. Sur la plupart des machines, cela suffit, et les quatre solutions ci-dessous couvrent les autres cas.

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 a supprimé cette indication de trois lignes dans la version 3.7.0. Sur une installation récente, vous obtenez donc uniquement la première ligne. Quelques mots changent sur certaines machines, mais la cause reste la même :

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

La plupart des utilisateurs ne lisent jamais l'une ou l'autre formulation. Ils rencontrent le problème sous la forme d'une seule ligne dans le panneau QGIS Log Messages, et d'un menu Processing vide :

Couldn't load plugin 'processing'

S'applique à Windows, à QGIS 3.16 et aux versions ultérieures, ainsi qu'à tout Python 3.8 ou plus récent qui exécute from osgeo import gdal.

La solution rapide

Lister chaque dossier de PATH qui contient une DLL GDAL

Ouvrez OSGeo4W Shell depuis le dossier QGIS dans le menu Start et exécutez ceci. La commande reproduit la logique propre de 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')))))"

Lisez la première ligne. Il s'agit du dossier choisi par GDAL, et il devrait se trouver dans votre installation QGIS. Conservez toute la sortie, car chaque solution ci-dessous s'appuie dessus.

Supprimer les entrées qui ne correspondent pas à QGIS

Anaconda, Miniconda, une deuxième installation de QGIS ou d'OSGeo4W, ou encore un autre ensemble GIS. Ouvrez Start, saisissez "environment variables", ouvrez Edit the system environment variables, puis Environment Variables, puis Path, et supprimez-les. Déconnectez-vous de Windows et reconnectez-vous.

Démarrer QGIS depuis son propre raccourci

Ne le démarrez pas depuis un shell dans lequel vous avez déjà exécuté le script activate d'un autre environnement. Un shell qui a placé un chemin gdal-dev en premier le transmet directement à QGIS.

Vérifier que la solution a fonctionné

Dans QGIS, ouvrez Plugins, puis Python Console, et exécutez :

from osgeo import gdal
print(gdal.__version__)

Un numéro de version sans traceback au-dessus signifie que les bonnes DLL ont été chargées. Ouvrez également le menu Processing, car la Toolbox réapparaît dès que le plugin processing peut importer GDAL. Un menu Processing vide signifie que le problème n'est pas encore résolu.

Solution 2 : exécuter votre script dans l'environnement QGIS

L'étape 1 n'a rien affiché. Aucun dossier de votre PATH ne contient de DLL GDAL. Rien n'a donc été enregistré, ce qui arrive lorsqu'un python.exe standard ou une configuration d'exécution PyCharm démarre en dehors de l'environnement QGIS. Exécutez plutôt le script dans OSGeo4W Shell, ou via python-qgis.bat dans le dossier bin de QGIS. Sur une installation long term release, ce fichier s'appelle python-qgis-ltr.bat. L'un comme l'autre enregistre le bon dossier de DLL avant le démarrage de Python.

Si l'erreur reste inchangée, passez à la solution 3.

Solution 3 : réparer une installation OSGeo4W partiellement mise à niveau

L'étape 1 a affiché plusieurs lignes, qui se trouvent toutes dans le même arbre OSGeo4W. Vous avez à la fois gdal et gdal-dev à la suite d'une mise à niveau interrompue. Relancez l'installateur OSGeo4W et réinstallez les packages gdal et qgis, ou réinstallez QGIS depuis l'installateur autonome. C'est le moyen le plus rapide de sortir de cette situation.

Si l'erreur reste inchangée, passez à la solution 4.

Solution 4 : définir USE_PATH_FOR_GDAL_PYTHON

L'étape 1 a affiché une seule ligne, celle de QGIS, et l'import échoue toujours. La variable mérite alors d'être essayée, et seulement à ce stade. Dans QGIS : Settings, puis Options, puis System, puis le groupe Environment. Cochez la case des variables personnalisées, ajoutez ce nom et cette valeur, puis redémarrez QGIS :

USE_PATH_FOR_GDAL_PYTHON=YES

Cela aide une petite minorité d'utilisateurs, pour la raison expliquée dans la section « Pourquoi cela se produit ».

Si l'erreur reste inchangée, passez à la solution 5.

Solution 5 : conserver un seul GDAL par environnement conda

Votre GDAL vient de conda. Utilisez uniquement conda-forge, dans un environnement neuf, et ne mélangez jamais une wheel GDAL pip au même endroit. Un canal, une seule copie.

Si l'erreur reste inchangée, envoyez-moi les trois éléments ci-dessous.

Pourquoi cela se produit

Python 3.8 a cessé de rechercher les DLL d'extension dans PATH. GDAL contourne ce changement dans osgeo/__init__.py. Lorsque USE_PATH_FOR_GDAL_PYTHON n'est pas défini, GDAL lit PATH dans l'ordre, enregistre avec os.add_dll_directory() le premier dossier contenant un gdal*.dll ou un libgdal*.dll, puis s'arrête. Le premier GDAL présent dans votre PATH est donc prioritaire. Lorsque cette copie n'est pas celle de QGIS, ses DLL ne correspondent pas au module _gdal avec lequel QGIS a été compilé.

Définir la variable élargit cette recherche au lieu de la restreindre, car GDAL enregistre alors chaque dossier de PATH et n'utilise aucun glob. La ligne que le message d'erreur affichait autrefois n'aide donc presque personne.

Notre AI Segmentation plugin lit les raster avec le GDAL fourni par QGIS et n'en installe aucun de son côté. Il fonctionne donc dès que l'import ci-dessus réussit. Le reste de ce que nous construisons pour QGIS se trouve sur la page QGIS AI.

Toujours bloqué ?

Envoyez-moi trois éléments : votre version de QGIS, le traceback complet et la sortie du contrôle de PATH de l'étape 1 de la solution rapide. Mon adresse est stephane.barbot@terra-lab.ai. La première ligne de cette sortie suffit généralement à déterminer lequel des cinq cas vous concerne.

Questions fréquentes

Pourquoi mon erreur ne mentionne-t-elle pas USE_PATH_FOR_GDAL_PYTHON ?

GDAL a supprimé ces trois lignes d'indication dans la version 3.7.0. Toute version récente affiche donc uniquement la première ligne, sans rien d'autre. La cause n'a pas changé. La solution est la même que celle que vous auriez appliquée avec la version 3.6.

Définir USE_PATH_FOR_GDAL_PYTHON=YES résout-il le problème ?

Rarement. C'est la solution 4 plutôt que la solution 1 pour une raison précise. La variable demande à GDAL d'enregistrer chaque dossier de PATH au lieu du premier qui contient une DLL GDAL. Elle élargit donc la recherche au lieu de la diriger vers QGIS. Essayez-la lorsque votre PATH ne montre plus qu'un seul dossier GDAL et que l'import échoue toujours.

Pourquoi ma Processing Toolbox a-t-elle disparu en même temps ?

Le plugin processing importe GDAL, il ne peut donc pas se charger, et QGIS écrit "Couldn't load plugin 'processing'" dans le panneau Log Messages. La Toolbox réapparaît automatiquement dès que l'import fonctionne. C'est donc le moyen le plus rapide de vérifier qu'une solution a bien été appliquée.

Que faire si le traceback indique _C au lieu de _gdal ?

Il s'agit d'un autre module et d'une autre solution. Un article lui est consacré : DLL load failed while importing _C.