[Gelöst] DLL load failed while importing _gdal in QGIS
Veröffentlicht am Aktualisiert am
ImportError: DLL load failed while importing _gdal verhindert jede Python-Ausführung, die from osgeo import gdal innerhalb von QGIS unter Windows aufruft, einschließlich der Processing Toolbox. Eine zweite GDAL-Kopie steht in PATH vor der QGIS-Version. Entfernen Sie deshalb die Nicht-QGIS-Ordner aus PATH und melden Sie sich anschließend bei Windows ab und wieder an. Auf den meisten Rechnern ist das die gesamte Lösung. Die vier folgenden Lösungen decken den Rest ab.
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 hat diesen dreizeiligen Hinweis in Version 3.7.0 entfernt. Bei einer aktuellen Installation erhalten Sie daher nur die erste Zeile. Auf manchen Rechnern ändert sich ein Wort, die Ursache bleibt dieselbe:
ImportError: DLL load failed while importing _gdal: The specified procedure could not be found.
Die meisten lesen keine der beiden Formulierungen. Sie sehen den Fehler als einzelne Zeile im QGIS Log Messages panel und ein Processing-Menü, in dem nichts steht:
Couldn't load plugin 'processing'
Gilt für Windows, QGIS 3.16 und neuer sowie für jedes Python 3.8 oder neuer, das from osgeo import gdal ausführt.
Die schnelle Lösung
Jeden Ordner in PATH auflisten, der eine GDAL-DLL enthält
Öffnen Sie die OSGeo4W Shell über den QGIS-Ordner im Start-Menü und führen Sie diesen Befehl aus. Er wiederholt die Logik von 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')))))"
Lesen Sie die erste Zeile. Das ist der von GDAL verwendete Ordner. Er sollte innerhalb Ihrer QGIS-Installation liegen. Bewahren Sie die gesamte Ausgabe auf. Jede der folgenden Lösungen verwendet sie.
Einträge löschen, die nicht zu QGIS gehören
Anaconda, Miniconda, eine zweite QGIS- oder OSGeo4W-Installation oder ein anderes GIS-Paket. Öffnen Sie Start, geben Sie "environment variables" ein, öffnen Sie Edit the system environment variables, anschließend Environment Variables, dann Path, und löschen Sie diese Einträge. Melden Sie sich bei Windows ab und wieder an.
QGIS über die eigene Verknüpfung starten
Nicht über eine Shell, in der Sie zuvor das activate-Skript einer anderen Umgebung ausgeführt haben. Eine Shell, die einen gdal-dev-Pfad an die erste Stelle gesetzt hat, übergibt ihn direkt an QGIS.
Prüfen, ob es funktioniert
Öffnen Sie in QGIS Plugins und anschließend Python Console und führen Sie Folgendes aus:
from osgeo import gdal
print(gdal.__version__)
Eine Versionsnummer ohne Traceback darüber bedeutet, dass die richtigen DLLs geladen wurden. Öffnen Sie außerdem das Processing-Menü. Die Toolbox erscheint wieder, sobald das processing plugin GDAL importieren kann. Ein leeres Processing-Menü bedeutet, dass Sie noch nicht fertig sind.
Lösung 2: Ihr Skript innerhalb der QGIS-Umgebung ausführen
Schritt 1 hat überhaupt nichts ausgegeben. Kein Ordner in PATH enthält eine GDAL-DLL. Es wurde also nie etwas registriert. Das passiert, wenn ein normales python.exe oder eine PyCharm-Run-Konfiguration außerhalb der QGIS-Umgebung startet. Führen Sie das Skript stattdessen in der OSGeo4W Shell aus oder über python-qgis.bat im QGIS-Ordner bin. Bei einer Long-Term-Release-Installation heißt die Datei python-qgis-ltr.bat. Beide Varianten registrieren den richtigen DLL-Ordner, bevor Python startet.
Wenn der Fehler unverändert bleibt, fahren Sie mit Lösung 3 fort.
Lösung 3: Eine halb aktualisierte OSGeo4W-Installation reparieren
Schritt 1 hat mehrere Zeilen ausgegeben, und alle liegen innerhalb desselben OSGeo4W-Baums. Sie haben sowohl gdal als auch gdal-dev aus einem Update, das nur zur Hälfte abgeschlossen wurde. Starten Sie das OSGeo4W-Installationsprogramm erneut und installieren Sie die Pakete gdal und qgis neu. Alternativ installieren Sie QGIS über das eigenständige Installationsprogramm neu. Das ist der schnellste Weg aus diesem Zustand.
Wenn der Fehler unverändert bleibt, fahren Sie mit Lösung 4 fort.
Lösung 4: USE_PATH_FOR_GDAL_PYTHON setzen
Schritt 1 hat eine Zeile ausgegeben, die QGIS-Zeile, und der Import schlägt weiterhin fehl. Jetzt ist die Variable einen Versuch wert, und erst jetzt. In QGIS: Settings, then Options, then System, then the Environment group. Aktivieren Sie das Kontrollkästchen für benutzerdefinierte Variablen, fügen Sie diesen Namen und Wert hinzu und starten Sie QGIS neu:
USE_PATH_FOR_GDAL_PYTHON=YES
Das hilft einer kleinen Minderheit der Nutzer. Der Grund wird unter "Warum das passiert" erklärt.
Wenn der Fehler unverändert bleibt, fahren Sie mit Lösung 5 fort.
Lösung 5: Pro conda-Umgebung nur eine GDAL-Version verwenden
Ihr GDAL kommt aus conda. Verwenden Sie es ausschließlich aus conda-forge in einer frischen Umgebung und mischen Sie niemals ein GDAL-Paket aus pip am selben Ort dazu. Ein Channel, eine Kopie.
Wenn der Fehler unverändert bleibt, senden Sie mir die drei folgenden Dinge.
Warum das passiert
Python 3.8 hat aufgehört, PATH nach Erweiterungs-DLLs zu durchsuchen. GDAL umgeht das in osgeo/__init__.py. Wenn USE_PATH_FOR_GDAL_PYTHON nicht gesetzt ist, liest GDAL PATH in der vorhandenen Reihenfolge, registriert den ersten Ordner mit einer gdal*.dll oder libgdal*.dll über os.add_dll_directory() und beendet die Suche. Deshalb gewinnt die früheste GDAL-Version in PATH. Wenn das nicht die QGIS-Version ist, passen ihre DLLs nicht zum _gdal-Modul, gegen das QGIS erstellt wurde.
Das Setzen der Variable erweitert diese Suche, statt sie einzugrenzen, weil GDAL dann jeden Ordner in PATH registriert und überhaupt keinen Glob verwendet. Die Zeile, die die Fehlermeldung früher ausgegeben hat, hilft daher fast niemandem.
Unser AI Segmentation plugin liest Raster über das GDAL, das QGIS bereits mitliefert, und installiert kein eigenes. Deshalb funktioniert es, sobald der obige Import funktioniert. Alles andere, was wir für QGIS entwickeln, finden Sie auf der QGIS AI-Seite.
Immer noch defekt?
Senden Sie mir drei Dinge: Ihre QGIS-Version, den vollständigen Traceback und die Ausgabe der PATH-Prüfung aus Schritt 1 der schnellen Lösung. Meine Adresse ist stephane.barbot@terra-lab.ai. Die erste Zeile dieser Ausgabe reicht normalerweise aus, um zu sagen, welcher der fünf Fälle vorliegt.
Häufige Fragen
Warum erwähnt mein Fehler USE_PATH_FOR_GDAL_PYTHON nicht?
GDAL hat diese drei Hinweiszeilen in Version 3.7.0 entfernt. Eine aktuelle Version gibt daher nur die erste Zeile und sonst nichts aus. An der Ursache hat sich dadurch nichts geändert. Die Lösung ist dieselbe, die Sie unter 3.6 angewendet hätten.
Behebt das Setzen von USE_PATH_FOR_GDAL_PYTHON=YES den Fehler?
Selten. Es ist aus gutem Grund Lösung 4 und nicht Lösung 1. Die Variable veranlasst GDAL, jeden Ordner in PATH zu registrieren, statt nur den ersten Ordner mit einer GDAL-DLL. Sie erweitert also die Suche, statt sie auf QGIS zu richten. Probieren Sie sie aus, sobald PATH einen einzigen GDAL-Ordner zeigt und der Import weiterhin fehlschlägt.
Warum ist meine Processing Toolbox gleichzeitig verschwunden?
Das processing plugin importiert GDAL, kann deshalb nicht geladen werden, und QGIS schreibt "Couldn't load plugin 'processing'" in das Log Messages panel. Die Toolbox erscheint von selbst wieder, sobald der Import funktioniert. Damit lässt sich am schnellsten feststellen, ob eine Lösung gegriffen hat.
Was ist, wenn der Traceback _C statt _gdal nennt?
Das ist ein anderes Modul und erfordert eine andere Lösung. Dazu gibt es einen eigenen Beitrag: DLL load failed while importing _C.


