Tamanho de fonte
Alto contraste
Altura de linha

Entendendo Importações Relativas no Python 3

Avatar de Ana Maria Gomes Ana Maria Gomes
4 minutos de leitura 5 meses atrás

Ao trabalhar com Python, especialmente em um projeto com múltiplos arquivos, você frequentemente precisará importar funções ou classes de um arquivo para outro. Esse é um cenário comum quando você está tentando organizar seu código em módulos e pacotes. No entanto, você pode encontrar alguns erros ao tentar realizar importações relativas. Vamos entender por que isso acontece e como resolver.

O Que Causa Erros de Importação no Python?

No Python 3, você pode tentar importar uma função de outro arquivo no mesmo diretório usando um dos seguintes métodos:

from .mymodule import myfunction

ou

from mymodule import myfunction

No entanto, você pode se deparar com erros como ImportError: attempted relative import with no known parent package, ModuleNotFoundError: No module named 'mymodule', ou SystemError: Parent module '' not loaded, cannot perform relative import. Esses erros ocorrem porque o Python espera que o módulo faça parte de um pacote e, às vezes, o módulo precisa ser executável como um script.

Estrutura do Projeto

Considere uma estrutura de projeto típica:

main.py
mypackage/
    __init__.py
    mymodule.py
    myothermodule.py

Em mymodule.py, você pode ter uma função as_int e uma função de teste _test. Da mesma forma, myothermodule.py pode importar as_int de mymodule e definir sua própria função add com uma função de teste. O arquivo main.py então importaria add de myothermodule.

Essa configuração funciona bem quando você executa main.py ou mypackage/mymodule.py, mas falha com mypackage/myothermodule.py devido à importação relativa.

Executando Scripts com Importações Relativas

Para executar um script com importações relativas, você deve usar a opção -m e fornecer o caminho no sistema de módulos do Python:

python3 -m mypackage.myothermodule

Este método é um pouco verboso e não combina bem com uma linha shebang como #!/usr/bin/env python3.

Soluções Alternativas

Evite Importações Relativas: Use importações absolutas, como:

    from mypackage.mymodule import as_int

    Modifique o PYTHONPATH: Execute a partir do pai de mypackage ou adicione esse diretório ao PYTHONPATH. Alternativamente, você pode modificar o PYTHONPATH no código:

      import sys
      import os
      
      SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
      sys.path.append(os.path.dirname(SCRIPT_DIR))
      
      from mypackage.mymodule import as_int

      Defina __package__ Manualmente: Se você está executando um script que faz parte de um pacote, você pode definir o atributo __package__ manualmente para permitir que as importações relativas funcionem.

      Use Importações Absolutas e setuptools: Substitua importações relativas por importações absolutas e instale seu pacote usando setuptools. Isso torna seu pacote importável de qualquer lugar.

      Código de Inicialização: Adicione o diretório pai do seu pacote ao sys.path antes de tentar importar qualquer coisa do pacote usando importações absolutas.

        Melhores Práticas

        Embora as importações relativas explícitas sejam uma alternativa aceitável às importações absolutas, elas podem ser problemáticas quando a estrutura de arquivos é complexa ou quando o script é executado como o módulo principal. A PEP 8 recomenda o uso de importações absolutas pela sua legibilidade e melhor comportamento.

        Resumo

        Em resumo, quando você encontra erros de importação no Python 3, isso geralmente se deve ao módulo não ser reconhecido como parte de um pacote ou ao script ser executado como o módulo principal. Para resolver isso, você pode usar importações absolutas, modificar o PYTHONPATH, definir o atributo __package__ manualmente ou usar setuptools para tornar seu pacote importável. Lembre-se de considerar a estrutura do seu projeto e escolher o método que melhor atenda às suas necessidades.

        Imagem de um notebook

        Cursos de programação gratuitos com certificado

        Aprenda a programar e desenvolva soluções para o seu trabalho com Python para alcançar novas oportunidades profissionais. Aqui na Asimov você encontra:

        • Conteúdos gratuitos
        • Projetos práticos
        • Certificados
        • +20 mil alunos e comunidade exclusiva
        • Materiais didáticos e download de código
        Inicie agora

        Comentários

        Comentar
        Faça parte da discussão Crie sua conta gratuita e compartilhe
        sua opinião nos comentários
        Entre para a Asimov