コンテンツへスキップ
QGIS
トラブルシューティング

[解決済み] QGISのDLL load failed importing _gdal対処法

公開日 更新日

ImportError: DLL load failed while importing _gdal は、Windows上のQGISで from osgeo import gdal を実行するPythonを壊します。Processing Toolboxも含まれます。QGISのものより前に、PATH上の別のGDALが存在するためです。QGIS以外のフォルダーをPATHから削除し、Windowsからサインアウトして再度サインインしてください。ほとんどのマシンではこれで解決し、残りは以下の4つで対応できます。

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はバージョン3.7.0でこの3行のヒントを削除したため、現在のインストールでは最初の1行だけが表示されます。マシンによって一部の単語が変わることはありますが、原因は同じです。

ImportError: DLL load failed while importing _gdal: The specified procedure could not be found.

ほとんどの人は、どちらの文言も読みません。QGIS Log Messages パネルに1行だけ表示され、Processingメニューが空になった状態で問題に気づきます。

Couldn't load plugin 'processing'

Windows、QGIS 3.16以降、および from osgeo import gdal を実行するPython 3.8以降が対象です。

簡単な対処法

PATH上でGDAL DLLを含むすべてのフォルダーを一覧表示する

Startメニューの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')))))"

最初の行を確認してください。そこがGDALが選択するフォルダーで、QGISのインストール先に含まれているはずです。出力全体を残してください。以下の各対処法で使用します。

QGIS以外のエントリを削除する

Anaconda、Miniconda、2つ目のQGISまたはOSGeo4Wのインストール、別のGISバンドルなどです。Startを開き、"environment variables" と入力して、Edit the system environment variables、次にEnvironment Variables、次にPathを開き、それらを削除します。Windowsからサインアウトして再度サインインしてください。

QGIS自身のショートカットからQGISを起動する

すでに別の環境のactivateスクリプトを実行したシェルから起動しないでください。gdal-dev のパスを先頭に置いたシェルは、そのパスをそのままQGISに渡します。

修正できたか確認する

QGISでPluginsを開き、次にPython Consoleを開いて、次を実行します。

from osgeo import gdal
print(gdal.__version__)

上にtracebackがなく、バージョン番号が表示されれば、正しいDLLが読み込まれています。Processingメニューも開いてください。processing pluginがGDALをimportできればToolboxはすぐに戻ります。Processingメニューが空のままなら、まだ完了していません。

対処法2: QGIS環境内でスクリプトを実行する

Step 1に何も表示されなかった場合です。PATH上にGDAL DLLを含むフォルダーがないため、何も登録されていません。これは、通常の python.exe やPyCharmの実行設定がQGIS環境の外から起動したときに発生します。OSGeo4W Shell内でスクリプトを実行するか、QGISの bin フォルダーにある python-qgis.bat を使ってください。long term releaseのインストールでは、ファイル名が python-qgis-ltr.bat です。どちらもPythonの起動前に正しいDLLフォルダーを登録します。

エラーが変わらなければ、対処法3へ進んでください。

対処法3: 中途半端にアップグレードされたOSGeo4Wを修復する

Step 1に複数の行が表示され、それらがすべて同じOSGeo4Wツリー内にある場合です。途中で止まったアップグレードによって、gdal と gdal-dev の両方が残っています。OSGeo4W installerを再実行して gdal と qgis パッケージを再インストールするか、standalone installerからQGISを再インストールしてください。これが最も早い解決策です。

エラーが変わらなければ、対処法4へ進んでください。

対処法4: USE_PATH_FOR_GDAL_PYTHONを設定する

Step 1に1行だけ、QGISのフォルダーが表示され、それでもimportに失敗する場合です。このときに限って変数を試す価値があります。QGISで Settings > Options > System > Environment を開きます。カスタム変数のチェックボックスをオンにし、次の名前と値を追加して、QGISを再起動してください。

USE_PATH_FOR_GDAL_PYTHON=YES

「なぜ起きるのか」で説明する理由により、これで解決する人は少数です。

エラーが変わらなければ、対処法5へ進んでください。

対処法5: conda環境ごとにGDALを1つだけ置く

GDALをcondaから取得している場合です。新しい環境でconda-forgeだけから取得し、同じ場所にpipのGDAL wheelを混在させないでください。1つのchannel、1つのコピーにします。

エラーが変わらなければ、以下の3つを送ってください。

なぜ起きるのか

Python 3.8では、拡張DLLをPATHから検索しなくなりました。GDALは osgeo/__init__.py でこの動作に対応しています。USE_PATH_FOR_GDAL_PYTHON が未設定の場合、GDALはPATHを順番に読み取り、gdal*.dll または libgdal*.dll を含む最初のフォルダーを os.add_dll_directory() で登録して、そこで検索を止めます。つまりPATH上で最初に見つかったGDALが優先されます。そのコピーがQGISのものでない場合、そのDLLはQGISがビルドした _gdal モジュールと一致しません。

この変数を設定すると、検索範囲は狭まらず広がります。GDALはPATH上のすべてのフォルダーを登録し、globを一切使わなくなるためです。そのため、以前エラーメッセージに表示されていた行は、ほとんどの人に役立ちません。

私たちの AI Segmentation plugin は、QGISに付属するGDALを使ってrasterを読み込み、自前のGDALはインストールしません。そのため、上のimportが動けばpluginも動作します。QGIS向けに作っているその他のものは、QGIS AI page にまとめています。

まだ解決しない場合

QGISのバージョン、完全なtraceback、そして簡単な対処法のStep 1で実行したPATHチェックの出力を送ってください。連絡先は stephane.barbot@terra-lab.ai です。その出力の最初の行だけで、5つのケースのどれに該当するか判断できることがほとんどです。

よくある質問

エラーにUSE_PATH_FOR_GDAL_PYTHONが表示されないのはなぜですか?

GDALはバージョン3.7.0でこの3行のヒントを削除しました。そのため、現在の環境では最初の1行だけが表示されます。原因が変わったわけではありません。3.6で適用したはずの対処法と同じです。

USE_PATH_FOR_GDAL_PYTHON=YESを設定すれば解決しますか?

まれに解決します。対処法1ではなく対処法4なのには理由があります。この変数を設定すると、GDAL DLLを含む最初のフォルダーだけでなく、PATH上のすべてのフォルダーをGDALに登録させます。QGISを指定するのではなく、検索範囲を広げる動作です。PATHにGDALフォルダーが1つだけ表示され、それでもimportに失敗するときに試してください。

Processing Toolboxが同時に消えたのはなぜですか?

processing pluginがGDALをimportするため、読み込めません。QGISはLog Messagesパネルに "Couldn't load plugin 'processing'" と書き込みます。importが動けばToolboxは自動的に戻るため、対処法が効いたかを確認する最も早い方法です。

tracebackが _gdal ではなく _C と表示される場合はどうすればよいですか?

それは別のモジュールで、対処法も異なります。専用の記事はこちらです: DLL load failed while importing _C。