Przejdź do treści
Wróć do bloga
QGIS
Troubleshooting

ImportError: DLL load failed while importing _gdal w QGIS na Windows

ImportError: DLL load failed while importing _gdal w QGIS na Windows

Druga kopia GDAL znajduje się w PATH, więc Windows ładuje jej biblioteki DLL zamiast tych z QGIS. Znajdź foldery zawierające gdal*.dll, usuń z PATH te, które nie należą do QGIS, a następnie wyloguj się z Windows i zaloguj ponownie.

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

Dotyczy Windows, QGIS 3.16 i nowszych wersji oraz każdego Python 3.8 lub nowszego, który importuje from osgeo import gdal. Ten sam błąd pojawia się również jako "Couldn't load plugin 'processing'" w panelu komunikatów dziennika QGIS.

Dlaczego tak się dzieje

Ostatnie trzy wiersze to wskazówka wypisywana przez GDAL, gdy import się nie powiedzie. Nie są przyczyną problemu, dlatego ustawienie zmiennej tak często niczego nie zmienia.

Python 3.8 przestał przeszukiwać PATH w poszukiwaniu rozszerzeń DLL. Plik osgeo/__init__.py obchodzi ten problem: przechodzi po PATH i dla każdego folderu zawierającego gdal*.dll lub libgdal*.dll wywołuje os.add_dll_directory(). Microsoft nie gwarantuje kolejności między folderami dodanymi w ten sposób, więc gdy obecne są dwie kopie, pierwszeństwo może uzyskać niewłaściwa, a jej biblioteki DLL nie pasują do modułu _gdal dostarczonego z QGIS. Druga, rzadsza przyczyna to zwykły python.exe lub uruchomienie z PyCharm poza środowiskiem QGIS, gdzie nie zarejestrowano żadnego folderu GDAL. Trzecia to niepełna aktualizacja instalacji OSGeo4W, zawierająca jednocześnie gdal i gdal-dev.

Aby je rozróżnić, uruchom kontrolę z kroku 1. Dwa lub więcej folderów oznacza pierwszą przyczynę. Zero folderów oznacza drugą.

Rozwiązanie

List every folder on PATH that holds a 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')))))"

Remove the copies that are not QGIS

Anaconda, Miniconda, druga instalacja QGIS lub OSGeo4W albo inny pakiet GIS, który umieszcza własny GDAL w PATH. Otwórz Start, wpisz "zmienne środowiskowe", otwórz Edytuj zmienne środowiskowe systemu, następnie Zmienne środowiskowe, a potem Path. Usuń te wpisy. Wyloguj się z Windows i zaloguj ponownie, aby każdy proces pobrał nowy PATH.

Start QGIS from its own shortcut

Nie uruchamiaj QGIS z powłoki, w której wcześniej uruchomiono skrypt aktywacyjny innego środowiska, ani z drugiej sesji OSGeo4W Shell. Powłoka, która ustawiła ścieżkę gdal-dev, przekaże ją do QGIS.

For an outside interpreter, borrow the QGIS environment

Uruchom skrypt wewnątrz OSGeo4W Shell albo przez python-qgis.bat w folderze bin QGIS. Spowoduje to zarejestrowanie właściwego folderu bibliotek DLL przed uruchomieniem Pythona.

Jeśli to nie pomogło

  • Ustaw zmienną, ale nie oczekuj wiele. W QGIS wybierz Ustawienia, następnie Opcje, System, a potem grupę Environment. Zaznacz pole zmiennych niestandardowych, dodaj USE_PATH_FOR_GDAL_PYTHON z wartością YES i uruchom QGIS ponownie. Pomaga to, gdy właściwy folder znajduje się w PATH i nic z nim nie konkuruje. Gdy obecne są dwie kopie GDAL, nie pomoże.
  • W conda instaluj gdal wyłącznie z conda-forge, w świeżym środowisku, i nigdy nie mieszaj go z pakietem GDAL wheel z pip.
  • Napraw instalację: uruchom ponownie instalator OSGeo4W i zainstaluj ponownie pakiety gdal oraz qgis albo zainstaluj QGIS ponownie z samodzielnego instalatora. To najszybszy sposób na rozwiązanie problemu niepełnej aktualizacji OSGeo4W.