QGIS: DLL load failed importing _gdal [Opgelost]
Gepubliceerd op Bijgewerkt op
ImportError: DLL load failed while importing _gdal breekt elke Python die binnen QGIS op Windows from osgeo import gdal uitvoert, inclusief de Processing Toolbox. Een tweede kopie van GDAL staat eerder op je PATH dan die van QGIS. Verwijder daarom de niet-QGIS-mappen uit PATH en meld je daarna af bij Windows en weer aan. Op de meeste machines is dat de volledige oplossing. De vier oplossingen hieronder dekken de rest.
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 heeft die hint van drie regels in versie 3.7.0 verwijderd. Op een actuele installatie krijg je dus alleen de eerste regel. Op sommige machines verandert één woord, maar de oorzaak is hetzelfde:
ImportError: DLL load failed while importing _gdal: The specified procedure could not be found.
De meeste mensen lezen geen van beide formuleringen. Ze komen de fout tegen als één regel in het QGIS Log Messages-paneel, en als een Processing-menu waarin niets staat:
Couldn't load plugin 'processing'
Van toepassing op Windows, QGIS 3.16 en later, en elke Python 3.8 of nieuwer die from osgeo import gdal uitvoert.
De snelle oplossing
Vermeld elke map op PATH met een GDAL-DLL
Open de OSGeo4W Shell vanuit de QGIS-map in het Start-menu en voer dit uit. Het herhaalt GDAL's eigen logica:
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')))))"
Lees de eerste regel. Dat is de map die GDAL gebruikt, en die hoort binnen je QGIS-installatie te staan. Bewaar de volledige uitvoer. Elke oplossing hieronder gebruikt die uitvoer.
Verwijder de vermeldingen die niet van QGIS zijn
Anaconda, Miniconda, een tweede QGIS- of OSGeo4W-installatie, een andere GIS-bundel. Open Start, typ "environment variables", open Edit the system environment variables, daarna Environment Variables, daarna Path, en verwijder ze. Meld je af bij Windows en weer aan.
Start QGIS via zijn eigen snelkoppeling
Niet vanuit een shell waarin je al het activate-script van een andere omgeving hebt uitgevoerd. Een shell die eerst een gdal-dev-pad heeft toegevoegd, geeft dat rechtstreeks door aan QGIS.
Controleer of het werkt
Open in QGIS Plugins, daarna Python Console, en voer dit uit:
from osgeo import gdal
print(gdal.__version__)
Een versienummer zonder traceback erboven betekent dat de juiste DLL's zijn geladen. Open ook het Processing-menu, want de Toolbox verschijnt weer zodra de processing-plugin GDAL kan importeren. Een leeg Processing-menu betekent dat je nog niet klaar bent.
Oplossing 2: voer je script uit binnen de QGIS-omgeving
Stap 1 gaf helemaal niets weer. Geen enkele map op je PATH bevat een GDAL-DLL. Er werd dus niets geregistreerd. Dat gebeurt wanneer een gewone python.exe of een PyCharm-runconfiguratie buiten de QGIS-omgeving start. Voer het script uit in de OSGeo4W Shell, of via python-qgis.bat in de QGIS-map bin. Bij een Long Term Release-installatie heet dat bestand python-qgis-ltr.bat. Beide registreren de juiste DLL-map voordat Python start.
Als de fout ongewijzigd blijft, ga dan naar Oplossing 3.
Oplossing 3: herstel een half bijgewerkte OSGeo4W-installatie
Stap 1 gaf meerdere regels weer en ze staan allemaal binnen dezelfde OSGeo4W-structuur. Je hebt zowel gdal als gdal-dev overgehouden van een upgrade die halverwege is gestopt. Start het OSGeo4W-installatieprogramma opnieuw en installeer de pakketten gdal en qgis opnieuw, of installeer QGIS opnieuw via het standalone-installatieprogramma. Dat is de snelste uitweg.
Als de fout ongewijzigd blijft, ga dan naar Oplossing 4.
Oplossing 4: stel USE_PATH_FOR_GDAL_PYTHON in
Stap 1 gaf één regel weer, die van QGIS, en de import mislukt nog steeds. Nu is de variabele het proberen waard, en pas nu. Ga in QGIS naar Settings, daarna Options, daarna System, daarna de groep Environment. Vink het vak voor aangepaste variabelen aan, voeg deze naam en waarde toe en start QGIS opnieuw:
USE_PATH_FOR_GDAL_PYTHON=YES
Het helpt een kleine minderheid van de mensen, om de reden die onder "Waarom gebeurt dit?" wordt uitgelegd.
Als de fout ongewijzigd blijft, ga dan naar Oplossing 5.
Oplossing 5: gebruik één GDAL per conda-omgeving
Je GDAL komt uit conda. Gebruik alleen conda-forge, in een nieuwe omgeving, en meng nooit een pip-GDAL-wheel in dezelfde omgeving. Eén kanaal, één kopie.
Als de fout ongewijzigd blijft, stuur me dan de drie dingen hieronder.
Waarom gebeurt dit?
Python 3.8 stopte met het zoeken naar extensie-DLL's in PATH. GDAL vangt dat op in osgeo/__init__.py. Als USE_PATH_FOR_GDAL_PYTHON niet is ingesteld, leest GDAL PATH in volgorde, registreert de eerste map met een gdal*.dll of libgdal*.dll via os.add_dll_directory() en stopt het zoeken. De eerste GDAL op je PATH wint dus. Als die kopie niet die van QGIS is, komen de DLL's niet overeen met de _gdal-module waartegen QGIS is gebouwd.
De variabele instellen verbreedt die zoekopdracht in plaats van die te beperken, omdat GDAL dan elke map op PATH registreert en helemaal niet naar glob-patronen zoekt. De regel die de foutmelding vroeger afdrukte helpt daarom bijna niemand.
Onze AI Segmentation plugin leest rasters via de GDAL die QGIS al meelevert en installeert geen eigen versie. De plugin werkt dus zodra de import hierboven werkt. De rest van wat we voor QGIS bouwen staat op de QGIS AI-pagina.
Nog steeds kapot?
Stuur me drie dingen: je QGIS-versie, de volledige traceback en de uitvoer van de PATH-controle uit stap 1 van de snelle oplossing. Mijn adres is stephane.barbot@terra-lab.ai. De eerste regel van die uitvoer is meestal genoeg om te bepalen in welke van de vijf gevallen je zit.
Veelgestelde vragen
Waarom vermeldt mijn foutmelding USE_PATH_FOR_GDAL_PYTHON niet?
GDAL heeft die drie hintregels in versie 3.7.0 verwijderd. Alles wat actueel is, drukt dus alleen de eerste regel af en verder niets. De oorzaak is daardoor niet veranderd. De oplossing is dezelfde als die je op 3.6 zou hebben gebruikt.
Lost USE_PATH_FOR_GDAL_PYTHON=YES het probleem op?
Zelden. Het is om een reden Oplossing 4 en niet Oplossing 1. De variabele zorgt ervoor dat GDAL elke map op PATH registreert in plaats van de eerste map met een GDAL-DLL. Daarmee wordt de zoekopdracht verbreed in plaats van dat QGIS wordt aangewezen. Probeer dit pas nadat je PATH één GDAL-map laat zien en de import nog steeds mislukt.
Waarom verdween mijn Processing Toolbox tegelijk?
De processing-plugin importeert GDAL en kan daarom niet laden. QGIS schrijft "Couldn't load plugin 'processing'" naar het Log Messages-paneel. De Toolbox komt vanzelf terug zodra de import werkt. Dat maakt dit de snelste manier om te zien of een oplossing resultaat heeft gehad.
Wat als de traceback _C vermeldt in plaats van _gdal?
Dat is een andere module en vraagt om een andere oplossing. Daarvoor is er een eigen bericht: DLL load failed while importing _C.


