QGIS: DLL load failed importing _gdal (Rozwiązane)
Opublikowano Zaktualizowano
ImportError: DLL load failed while importing _gdal uniemożliwia uruchomienie dowolnego kodu Python, który wykonuje from osgeo import gdal wewnątrz QGIS w systemie Windows, w tym Processing Toolbox. Druga kopia GDAL znajduje się wcześniej na PATH niż kopia QGIS, więc usuń te foldery spoza QGIS z PATH, a następnie wyloguj się z Windows i zaloguj ponownie. Na większości komputerów to wystarczy, a cztery poniższe sposoby obejmują pozostałe przypadki.
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 usunął tę trzywierszową wskazówkę w wersji 3.7.0, więc w aktualnej instalacji pojawia się tylko pierwszy wiersz. Na niektórych komputerach zmienia się jedno słowo, ale przyczyna pozostaje ta sama:
ImportError: DLL load failed while importing _gdal: The specified procedure could not be found.
Większość osób nigdy nie czyta żadnej z tych wersji. Widzą błąd jako jeden wiersz w panelu QGIS Log Messages oraz menu Processing bez żadnej zawartości:
Couldn't load plugin 'processing'
Dotyczy systemu Windows, QGIS 3.16 i nowszych oraz dowolnego Python 3.8 lub nowszego, który uruchamia from osgeo import gdal.
Szybka naprawa
Wyświetl każdy folder na PATH zawierający bibliotekę GDAL DLL
Otwórz OSGeo4W Shell z folderu QGIS w menu Start i uruchom to polecenie, które powtarza własną logikę 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')))))"
Odczytaj pierwszy wiersz. To folder, który wybiera GDAL, i powinien znajdować się wewnątrz instalacji QGIS. Zachowaj cały wynik, ponieważ każdy z poniższych sposobów z niego korzysta.
Usuń wpisy, które nie należą do QGIS
Anaconda, Miniconda, druga instalacja QGIS lub OSGeo4W, inny pakiet GIS. Otwórz Start, wpisz "environment variables", otwórz Edit the system environment variables, następnie Environment Variables, potem Path, i usuń te wpisy. Wyloguj się z Windows i zaloguj ponownie.
Uruchamiaj QGIS z jego własnego skrótu
Nie z powłoki, w której wcześniej uruchomiono skrypt activate innego środowiska. Powłoka, która umieściła ścieżkę gdal-dev na początku, przekazuje ją bezpośrednio do QGIS.
Sprawdź, czy zadziałało
W QGIS otwórz Plugins, następnie Python Console, i uruchom:
from osgeo import gdal
print(gdal.__version__)
Numer wersji bez tracebacku powyżej oznacza, że załadowano właściwe biblioteki DLL. Otwórz również menu Processing, ponieważ Toolbox wraca natychmiast, gdy plugin processing może zaimportować GDAL, a puste menu Processing oznacza, że problem nadal nie został rozwiązany.
Rozwiązanie 2: uruchom skrypt wewnątrz środowiska QGIS
Krok 1 nie wyświetlił niczego. Żaden folder na PATH nie zawiera biblioteki GDAL DLL, więc nic nie zostało zarejestrowane. Dzieje się tak, gdy zwykły python.exe lub konfiguracja uruchomieniowa PyCharm startuje poza środowiskiem QGIS. Uruchom skrypt w OSGeo4W Shell albo przez python-qgis.bat w folderze bin QGIS. W instalacji long term release plik nosi nazwę python-qgis-ltr.bat. Oba pliki rejestrują właściwy folder DLL, zanim uruchomi się Python.
Jeśli błąd się nie zmienił, przejdź do rozwiązania 3.
Rozwiązanie 3: napraw częściowo zaktualizowaną instalację OSGeo4W
Krok 1 wyświetlił kilka wierszy i wszystkie znajdują się w tym samym drzewie OSGeo4W. Masz jednocześnie gdal i gdal-dev z aktualizacji, która zatrzymała się w połowie. Uruchom ponownie instalator OSGeo4W i zainstaluj ponownie pakiety gdal oraz qgis albo zainstaluj ponownie QGIS z instalatora standalone. To najszybszy sposób, by wyjść z tej sytuacji.
Jeśli błąd się nie zmienił, przejdź do rozwiązania 4.
Rozwiązanie 4: ustaw USE_PATH_FOR_GDAL_PYTHON
Krok 1 wyświetlił jeden wiersz, dotyczący QGIS, ale import nadal się nie udaje. Teraz warto spróbować tej zmiennej, i dopiero teraz. W QGIS: Settings > Options > System > Environment. Zaznacz pole zmiennych niestandardowych, dodaj poniższą nazwę i wartość, a następnie uruchom ponownie QGIS:
USE_PATH_FOR_GDAL_PYTHON=YES
Pomaga niewielkiej mniejszości użytkowników, z powodu wyjaśnionego w sekcji „Dlaczego tak się dzieje”.
Jeśli błąd się nie zmienił, przejdź do rozwiązania 5.
Rozwiązanie 5: używaj jednej wersji GDAL w każdym środowisku conda
Twój GDAL pochodzi z conda. Pobieraj go wyłącznie z conda-forge, w świeżym środowisku, i nigdy nie mieszaj pip GDAL wheel w tym samym miejscu. Jeden kanał, jedna kopia.
Jeśli błąd się nie zmienił, wyślij mi trzy rzeczy wymienione poniżej.
Dlaczego tak się dzieje
Python 3.8 przestał wyszukiwać biblioteki DLL rozszerzeń w PATH. GDAL obchodzi ten problem w osgeo/__init__.py. Gdy USE_PATH_FOR_GDAL_PYTHON jest nieustawiona, GDAL odczytuje PATH w kolejności, rejestruje pierwszy folder zawierający gdal*.dll lub libgdal*.dll za pomocą os.add_dll_directory() i kończy wyszukiwanie. Wygrywa więc najwcześniejszy GDAL na PATH, a gdy nie jest to kopia QGIS, jego biblioteki DLL nie pasują do modułu _gdal, z którym zbudowano QGIS.
Ustawienie tej zmiennej rozszerza wyszukiwanie zamiast je zawężać, ponieważ GDAL rejestruje wtedy każdy folder na PATH i nie używa żadnego globu. Wiersz, który wcześniej wyświetlał komunikat o błędzie, pomaga więc prawie nikomu.
Nasz AI Segmentation plugin odczytuje dane raster przez GDAL dostarczany już przez QGIS i nie instaluje własnej kopii, więc działa od razu po poprawnym wykonaniu powyższego importu. Wszystko inne, co budujemy dla QGIS, znajdziesz na stronie QGIS AI.
Nadal nie działa?
Wyślij mi trzy rzeczy: wersję QGIS, pełny traceback oraz wynik sprawdzenia PATH z kroku 1 szybkiej naprawy. Mój adres to stephane.barbot@terra-lab.ai. Pierwszy wiersz tego wyniku zwykle wystarcza, aby określić, z którym z pięciu przypadków masz do czynienia.
Pytania, które zadają użytkownicy
Dlaczego mój błąd nie wspomina o USE_PATH_FOR_GDAL_PYTHON?
GDAL usunął te trzy wiersze wskazówki w wersji 3.7.0, więc każda aktualna wersja wyświetla pierwszy wiersz i nic więcej. Przyczyna się przez to nie zmieniła. Naprawa jest taka sama jak ta, którą zastosowałbyś w wersji 3.6.
Czy ustawienie USE_PATH_FOR_GDAL_PYTHON=YES naprawi problem?
Rzadko, dlatego to rozwiązanie 4, a nie rozwiązanie 1. Zmienna powoduje, że GDAL rejestruje każdy folder na PATH zamiast pierwszego folderu zawierającego bibliotekę GDAL DLL. Rozszerza więc wyszukiwanie, zamiast wskazywać QGIS. Spróbuj jej dopiero wtedy, gdy PATH pokazuje jeden folder GDAL, a import nadal się nie udaje.
Dlaczego mój Processing Toolbox zniknął w tym samym czasie?
Plugin processing importuje GDAL, więc nie może się załadować, a QGIS zapisuje „Couldn't load plugin 'processing'” w panelu Log Messages. Toolbox wraca sam po naprawieniu importu, co czyni go najszybszym sposobem sprawdzenia, czy naprawa zadziałała.
Co zrobić, jeśli traceback zawiera _C zamiast _gdal?
To inny moduł i inna naprawa. Ma własny wpis: DLL load failed while importing _C.


