Ga naar inhoud
Terug naar blog
QGIS
Troubleshooting

ImportError: DLL laden mislukt bij het importeren van _gdal in QGIS op Windows

ImportError: DLL load failed while importing _gdal in QGIS on Windows

Een tweede GDAL-kopie staat in je PATH en Windows laadt de DLL's daarvan in plaats van die van QGIS. Zoek de mappen met een gdal*.dll, verwijder de mappen die niet bij QGIS horen uit PATH en meld je af bij Windows en daarna weer aan.

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().

Van toepassing op Windows, QGIS 3.16 en nieuwer, en op elke Python 3.8 of nieuwer die from osgeo import gdal importeert. Dezelfde fout verschijnt ook als "Couldn't load plugin 'processing'" in het paneel QGIS Log Messages.

Waarom het gebeurt

De laatste drie regels zijn een aanwijzing die GDAL afdrukt wanneer het importeren mislukt. Ze zijn niet de oorzaak. Daarom verandert het instellen van de variabele zo vaak niets.

Python 3.8 stopte met zoeken in PATH naar extensie-DLL's. Het bestand osgeo/__init__.py van GDAL omzeilt dat: het doorloopt PATH en roept voor elke map met een gdal*.dll of libgdal*.dll os.add_dll_directory() aan. Microsoft belooft geen volgorde tussen mappen die op deze manier zijn toegevoegd. Als er twee kopieën aanwezig zijn, kan de verkeerde winnen en komen de DLL's daarvan niet overeen met de _gdal-module die QGIS heeft meegeleverd. Tweede oorzaak, minder vaak voorkomend: een gewone python.exe of een PyCharm-run buiten de QGIS-omgeving, waar helemaal geen GDAL-map is geregistreerd. Derde oorzaak: een gedeeltelijk bijgewerkte OSGeo4W-installatie met zowel gdal als gdal-dev.

Om ze uit elkaar te houden, voer je de controle uit in stap 1. Twee of meer mappen betekent de eerste oorzaak. Nul mappen betekent de tweede.

De oplossing

Vermeld elke map op PATH die een GDAL-DLL bevat

Open de OSGeo4W Shell vanuit de QGIS-map in het Startmenu en voer dit uit. Hiermee wordt GDAL's eigen logica herhaald:

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')))))"

Verwijder de kopieën die niet van QGIS zijn

Anaconda, Miniconda, een tweede QGIS- of OSGeo4W-installatie, of een andere GIS-bundel die zijn eigen GDAL op PATH zet. Open Start, typ "omgevingsvariabelen", open Systeemomgevingsvariabelen bewerken, daarna Omgevingsvariabelen en daarna Path. Verwijder die vermeldingen. Meld je af bij Windows en meld je daarna weer aan, zodat elk proces het nieuwe PATH overneemt.

Start QGIS via de eigen snelkoppeling

Niet vanuit een shell waarin je al het activate-script van een andere omgeving hebt uitgevoerd, en niet vanuit een tweede OSGeo4W-shellsessie. Een shell die een gdal-dev-pad heeft ingesteld, geeft dit door aan QGIS.

Gebruik voor een externe interpreter de QGIS-omgeving

Voer je script uit in de OSGeo4W Shell, of via python-qgis.bat in de QGIS-map bin. Daarmee wordt de juiste DLL-map geregistreerd voordat Python start.

Als dit niet heeft gewerkt

  • Stel de variabele in, maar verwacht er niet veel van. In QGIS: Instellingen, daarna Opties, daarna Systeem, daarna de groep Omgeving. Vink het vakje voor aangepaste variabelen aan, voeg USE_PATH_FOR_GDAL_PYTHON toe met de waarde YES en start QGIS opnieuw. Dit helpt wanneer de juiste map op PATH staat en niets daarmee concurreert. Met twee GDAL-kopieën werkt het niet.
  • Gebruik in conda alleen gdal van conda-forge, in een nieuwe omgeving, en meng er nooit een GDAL-wheel van pip doorheen.
  • Herstel de installatie: voer het OSGeo4W-installatieprogramma opnieuw uit en installeer de pakketten gdal en qgis opnieuw, of installeer QGIS opnieuw met het zelfstandige installatieprogramma. Dit is de snelste uitweg uit een gedeeltelijk bijgewerkte OSGeo4W-installatie.