QGIS Windows 导入 _gdal 报错:ImportError: DLL load failed while importing _gdal
ImportError: DLL load failed while importing _gdal in QGIS on Windows
PATH 中存在第二份 GDAL,Windows 加载的是它的 DLL,而不是 QGIS 的 DLL。找出包含 gdal*.dll 的文件夹,从 PATH 中移除不属于 QGIS 的文件夹,然后退出 Windows 账户并重新登录。
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 的 Python 3.8 或更高版本。同一个错误也会在 QGIS 的日志消息面板中显示为 "Couldn't load plugin 'processing'"。
原因
导入失败时,GDAL 会打印最后三行内容。这些内容不是根本原因,所以设置该变量通常不起作用。
Python 3.8 停止为扩展 DLL 搜索 PATH。GDAL 的 osgeo/__init__.py 对此进行了处理:它遍历 PATH,对于每个包含 gdal*.dll 或 libgdal*.dll 的文件夹调用 os.add_dll_directory()。Microsoft 没有承诺以特定顺序处理通过这种方式添加的文件夹,因此当存在两个副本时,错误的副本可能会优先加载,而其中的 DLL 与 QGIS 提供的 _gdal 模块不匹配。第二种原因不太常见,即在 QGIS 环境之外运行普通的 python.exe 或 PyCharm,此时根本没有注册 GDAL 文件夹。第三种原因是 OSGeo4W 安装升级不完整,同时保留了 gdal 和 gdal-dev。
要区分这些情况,请执行第 1 步中的检查。显示两个或更多文件夹,说明是第一种原因。显示零个文件夹,说明是第二种原因。
修复方法
列出 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、第二个 QGIS 或 OSGeo4W 安装,或者其他将自有 GDAL 放入 PATH 的 GIS 软件包。打开开始菜单,输入 "environment variables",打开 Edit the system environment variables,然后依次打开 Environment Variables 和 Path。删除这些条目。退出 Windows 账户并重新登录,使每个进程都获取新的 PATH。
从 QGIS 自己的快捷方式启动 QGIS
不要从已经运行过其他环境 activate 脚本的 shell 启动,也不要从第二个 OSGeo4W shell 会话启动。设置了 gdal-dev 路径的 shell 会将该路径传递给 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 副本时则不起作用。 - 在 conda 中,只在全新的环境里从 conda-forge 安装
gdal,不要将 pip 的 GDAL wheel 混入其中。 - 修复安装:重新运行 OSGeo4W 安装程序并重新安装
gdal和qgis软件包,或者使用独立安装程序重新安装 QGIS。这是摆脱 OSGeo4W 不完整升级状态的最快方法。

