QGIS(Windows)で「ImportError: DLL load failed while importing _gdal」が出る原因と解決方法
ImportError: DLL load failed while importing _gdal in QGIS on Windows
PATH上にGDALのコピーがもう1つあると、WindowsはQGISのDLLではなく、そちらのDLLを読み込みます。gdal*.dllを含むフォルダーを見つけ、QGIS以外のものをPATHから外してから、サインアウトして再度サインインしてください。
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().
対象はWindows、QGIS 3.16以降、およびfrom osgeo import gdalをimportするPython 3.8以降です。同じエラーは、QGISのログメッセージパネルで "Couldn't load plugin 'processing'" と表示されることもあります。
原因
最後の3行は、importに失敗したときにGDALが出力するヒントです。原因そのものではありません。そのため、変数を設定しても変化しないことが多くあります。
Python 3.8では、拡張DLLをPATHから検索しなくなりました。GDALのosgeo/__init__.pyはこの問題に対処するため、PATHを走査し、gdal*.dllまたはlibgdal*.dllを含むすべてのフォルダーに対してos.add_dll_directory()を呼び出します。Microsoftは、この方法で追加されたフォルダー間の順序を保証していません。そのため、2つのコピーが存在すると、誤った方が優先されることがあります。そのDLLは、QGISに同梱された_gdalモジュールと一致しません。あまり一般的ではない2つ目の原因は、QGIS環境の外で通常のpython.exeを実行したり、PyCharmから実行したりして、GDALフォルダーがまったく登録されていないことです。3つ目は、gdalとgdal-devの両方を含む、途中までアップグレードされたOSGeo4Wのインストールです。
原因を区別するには、手順1のチェックを実行してください。フォルダーが2つ以上あれば1つ目の原因です。フォルダーが0個なら2つ目の原因です。
解決方法
PATH上でGDAL DLLを含むすべてのフォルダーを一覧表示する
スタートメニューのQGISフォルダーからOSGeo4W Shellを開き、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')))))"
QGIS以外のコピーを削除する
Anaconda、Miniconda、2つ目のQGISまたはOSGeo4Wのインストール、その他のGISバンドルが独自のGDALをPATHに追加している場合があります。スタートを開き、「environment variables」と入力し、「Edit the system environment variables」、「Environment Variables」、「Path」の順に開きます。該当するエントリを削除します。すべてのプロセスが新しいPATHを取得できるよう、Windowsからサインアウトして再度サインインしてください。
専用のショートカットからQGISを起動する
別の環境のactivateスクリプトをすでに実行したシェルから起動しないでください。また、2つ目のOSGeo4W Shellセッションからも起動しないでください。gdal-devのパスを設定したシェルは、そのパスをQGISに渡します。
外部のインタープリターではQGIS環境を利用する
OSGeo4W Shell内でスクリプトを実行するか、QGISのbinフォルダーにあるpython-qgis.batを通して実行します。これにより、Pythonの起動前に正しいDLLフォルダーが登録されます。
それでも解決しない場合
- 変数を設定します。ただし、効果はあまり期待しないでください。QGISで「Settings」、「Options」、「System」、「Environment」グループの順に開きます。カスタム変数のチェックボックスをオンにし、
USE_PATH_FOR_GDAL_PYTHONに値YESを追加して、QGISを再起動します。PATH上に正しいフォルダーがあり、競合するものがない場合には役立ちます。GDALのコピーが2つ存在する場合には役立ちません。 - condaでは、新しい環境で
gdalをconda-forgeからのみ取得し、pipのGDAL wheelを混在させないでください。 - インストールを修復します。OSGeo4Wインストーラーを再実行して
gdalとqgisパッケージを再インストールするか、スタンドアロンインストーラーからQGISを再インストールしてください。途中までアップグレードされたOSGeo4Wから抜け出す最短の方法です。

