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.
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
Comentários