Pular para o conteúdo
QGIS
Solução de problemas

[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.