[Resolvido] DLL load failed importing _gdal no QGIS
Publicado em Atualizado em
ImportError: DLL load failed while importing _gdal interrompe qualquer Python que execute from osgeo import gdal dentro do QGIS no Windows, incluindo o Processing Toolbox. Uma segunda cópia do GDAL fica antes da do QGIS no seu PATH, então remova essas pastas que não são do QGIS do PATH e saia da sessão do Windows antes de entrar novamente. Na maioria das máquinas, essa é toda a correção. As quatro abaixo cobrem o restante.
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().
O GDAL removeu essa dica de três linhas na versão 3.7.0. Portanto, em uma instalação atual, você recebe apenas a primeira linha. Em algumas máquinas, uma palavra muda, mas a causa é a mesma:
ImportError: DLL load failed while importing _gdal: The specified procedure could not be found.
A maioria das pessoas nunca lê nenhum dos dois textos. Elas encontram o problema como uma única linha no painel QGIS Log Messages e um menu Processing vazio:
Couldn't load plugin 'processing'
Aplica-se ao Windows, ao QGIS 3.16 e posteriores, e a qualquer Python 3.8 ou mais recente que execute from osgeo import gdal.
A correção rápida
Liste todas as pastas do PATH que contêm uma DLL do GDAL
Abra o OSGeo4W Shell na pasta do QGIS, no Start menu, e execute isto, que repete a própria lógica do 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')))))"
Leia a primeira linha. Essa é a pasta usada pelo GDAL, e ela deve estar dentro da sua instalação do QGIS. Guarde toda a saída, pois cada correção abaixo usa essas informações.
Exclua as entradas que não são do QGIS
Anaconda, Miniconda, uma segunda instalação do QGIS ou do OSGeo4W, ou outro pacote GIS. Abra o Start, digite "environment variables", abra Edit the system environment variables, depois Environment Variables, depois Path, e exclua essas entradas. Saia da sessão do Windows e entre novamente.
Inicie o QGIS pelo próprio atalho
Não a partir de um shell no qual você já executou o script activate de outro ambiente. Um shell que colocou um caminho gdal-dev primeiro o entrega diretamente ao QGIS.
Verifique se funcionou
No QGIS, abra Plugins, depois Python Console, e execute:
from osgeo import gdal
print(gdal.__version__)
Um número de versão sem traceback acima dele significa que as DLLs corretas foram carregadas. Abra também o menu Processing, porque o Toolbox volta no momento em que o plugin processing consegue importar o GDAL. Um menu Processing vazio significa que o problema ainda não foi resolvido.
Correção 2: execute seu script dentro do ambiente do QGIS
A Etapa 1 não exibiu nada. Nenhuma pasta do seu PATH contém uma DLL do GDAL, então nada foi registrado. Isso acontece quando um python.exe comum ou uma configuração de execução do PyCharm é iniciada fora do ambiente do QGIS. Execute o script no OSGeo4W Shell ou por meio de python-qgis.bat na pasta bin do QGIS. Em uma instalação de versão de suporte prolongado, esse arquivo se chama python-qgis-ltr.bat. Ambos registram a pasta correta das DLLs antes de o Python iniciar.
Se o erro não mudar, vá para a Correção 3.
Correção 3: repare uma instalação do OSGeo4W atualizada pela metade
A Etapa 1 exibiu várias linhas, e todas ficam dentro da mesma árvore do OSGeo4W. Você está carregando gdal e gdal-dev ao mesmo tempo, devido a uma atualização que foi interrompida no meio. Execute novamente o instalador do OSGeo4W e reinstale os pacotes gdal e qgis, ou reinstale o QGIS pelo instalador independente, que é a saída mais rápida.
Se o erro não mudar, vá para a Correção 4.
Correção 4: defina USE_PATH_FOR_GDAL_PYTHON
A Etapa 1 exibiu uma linha, a do QGIS, e a importação ainda falha. Agora vale a pena tentar definir a variável, e somente agora. No QGIS: Settings, depois Options, depois System, depois o grupo Environment. Marque a caixa de variáveis personalizadas, adicione este nome e valor e reinicie o QGIS:
USE_PATH_FOR_GDAL_PYTHON=YES
Isso ajuda uma pequena minoria das pessoas, pelo motivo explicado em "Por que isso acontece".
Se o erro não mudar, vá para a Correção 5.
Correção 5: mantenha um GDAL por ambiente conda
Seu GDAL vem do conda. Use apenas o conda-forge, em um ambiente novo, e nunca misture um wheel de GDAL do pip no mesmo local. Um canal, uma cópia.
Se o erro não mudar, envie-me as três informações abaixo.
Por que isso acontece
O Python 3.8 parou de procurar DLLs de extensão no PATH. O GDAL contorna isso em osgeo/__init__.py. Com USE_PATH_FOR_GDAL_PYTHON não definida, o GDAL lê o PATH em ordem, registra a primeira pasta que contém uma gdal*.dll ou libgdal*.dll com os.add_dll_directory() e para de procurar. Portanto, o primeiro GDAL do seu PATH vence. Quando essa cópia não é a do QGIS, suas DLLs não correspondem ao módulo _gdal contra o qual o QGIS foi compilado.
Definir a variável amplia essa busca em vez de restringi-la, porque o GDAL passa a registrar todas as pastas do PATH e não usa nenhum glob. Por isso, a linha que costumava ser exibida pela mensagem de erro ajuda quase ninguém.
Nosso plugin AI Segmentation lê rasters por meio do GDAL que o QGIS já fornece e não instala nenhum GDAL próprio. Portanto, ele funciona assim que a importação acima funciona. O restante do que desenvolvemos para o QGIS está na página QGIS AI.
Ainda não funciona?
Envie-me três informações: sua versão do QGIS, o traceback completo e a saída da verificação do PATH na etapa 1 da correção rápida. Meu endereço é stephane.barbot@terra-lab.ai. A primeira linha dessa saída geralmente basta para dizer em qual dos cinco casos você se encontra.
Perguntas frequentes
Por que meu erro não menciona USE_PATH_FOR_GDAL_PYTHON?
O GDAL removeu essas três linhas de dica na versão 3.7.0. Portanto, qualquer versão atual imprime a primeira linha e nada mais. A causa não mudou. A correção é a mesma que você teria aplicado na versão 3.6.
Definir USE_PATH_FOR_GDAL_PYTHON=YES corrige o problema?
Raramente. Há um motivo para ela ser a Correção 4 em vez da Correção 1. A variável faz o GDAL registrar todas as pastas do PATH, em vez da primeira que contém uma DLL do GDAL. Isso amplia a busca em vez de apontá-la para o QGIS. Tente depois que seu PATH mostrar uma única pasta do GDAL e a importação ainda falhar.
Por que meu Processing Toolbox desapareceu ao mesmo tempo?
O plugin processing importa o GDAL, então não consegue carregar, e o QGIS escreve "Couldn't load plugin 'processing'" no painel QGIS Log Messages. O Toolbox volta sozinho assim que a importação funciona, o que faz dele a maneira mais rápida de verificar se uma correção funcionou.
E se o traceback disser _C em vez de _gdal?
Esse é um módulo diferente e exige outra correção. Ele tem seu próprio post: DLL load failed while importing _C.


