[解決済み] 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。


