O erroImportError: tentativa de importação relativa sem pacote pai conhecido em Python confunde muitos desenvolvedores. Isso acontece quando você executa um arquivo que usa importações relativas como um script em vez de como parte de um pacote. Veja por que isso acontece e como consertar.
📋 Table of Contents
- Por que isso acontece
- A configuração que aciona
- Correção 1: execute como um módulo com -m
- Correção 2: use importações absolutas
- Correção 3: adicione um ponto de entrada adequado
- Correção 4: torne-o um pacote instalável adequado
- Compreendendo as importações relativas e absolutas
- O requisito __init__.py
- Guia de decisão rápida
- Perguntas frequentes
- ) ou crie um ponto de entrada adequado na raiz do projeto
Por que isso acontece
As importações relativas (from .module import x) só funcionam quando o Python sabe que o arquivo faz parte de um pacote. Quando você executa um arquivo diretamente (python myfile.py), o Python o trata como um script de nível superior sem pacote pai – portanto, as importações relativas falham. O. na importação não tem nenhum pacote ao qual se relacionar.
A configuração que aciona
# Project structure
myproject/
├── mypackage/
│ ├── __init__.py
│ ├── main.py
│ └── helper.py
# main.py uses a relative import
# from .helper import do_something
# 🐛 Running directly fails
python mypackage/main.py
# ImportError: attempted relative import with no known parent package
Correção 1: execute como um módulo com -m
# Run from the PROJECT ROOT (parent of mypackage) using -m
cd myproject
python -m mypackage.main
# The -m flag runs it as a module within the package,
# so Python knows the parent package and relative imports work
Esta é a maneira correta de executar o código do pacote que usa importações relativas. Observe que você executa a partir da raiz do projeto e usa pontos, não barras.
Correção 2: use importações absolutas
# Instead of relative imports:
# from .helper import do_something # relative
# Use absolute imports:
from mypackage.helper import do_something # absolute
# Absolute imports work whether run as a script or module,
# as long as the package is on the Python path
Correção 3: adicione um ponto de entrada adequado
# Create a run script at the project root (outside the package)
# myproject/run.py
from mypackage.main import main
if __name__ == '__main__':
main()
# Run it from the root — absolute imports resolve correctly
python run.py
Correção 4: torne-o um pacote instalável adequado
# pyproject.toml
[project]
name = "mypackage"
version = "0.1.0"
[project.scripts]
mypackage = "mypackage.main:main"
# Install in editable mode
pip install -e .
# Now run via the entry point — imports work correctly
mypackage
# Or: python -m mypackage.main
Compreendendo as importações relativas e absolutas
# Relative imports (need a parent package)
from . import sibling_module # same package
from .helper import func # module in same package
from ..other_package import thing # parent package
# Absolute imports (need package on path)
from mypackage.helper import func
from mypackage.subpackage.mod import thing
# Rule of thumb: absolute imports are more explicit and robust.
# Use them unless you have a specific reason for relative imports.
O requisito __init__.py
# For a directory to be a package (enabling relative imports),
# it typically needs an __init__.py file:
mypackage/
├── __init__.py # makes mypackage a package (can be empty)
├── main.py
└── helper.py
# Without __init__.py, Python may treat it as a namespace package
# (works in modern Python but can cause confusion). For clarity,
# include __init__.py in packages that use relative imports.
Guia de decisão rápida
- Executando um arquivo de pacote para desenvolvimento? Usar
python -m package.moduleda raiz do projeto - Quer importações que sempre funcionem? Use importações absolutas (
from mypackage.x import y) - Construindo um projeto real?Torne-o um pacote instalável com um ponto de entrada
- Apenas um script simples?Não use importações relativas — use absolutas ou coloque tudo em um arquivo
Perguntas frequentes
P: Por que as importações relativas funcionam em alguns arquivos, mas não em outros?
R: Elas funcionam quando o arquivo é importado como parte de um pacote, mas falham quando executadas diretamente como um script. O mesmo arquivo can work when imported and fail when run with python file.py — because direct execution has no parent package.
Q: Should I use relative or absolute imports?
A: Absolute imports are generally recommended — they’re explicit, work in more situations, and are clearer about where things come from. Use relative imports only within a package when it improves readability, and understand they require running as a module.
Q: What does the -m flag actually do?
A: It runs um módulo como parte de seu pacote, configurando o contexto do pacote para que as importações relativas sejam resolvidaspython -m mypackage.mainR: No Python moderno, os pacotes de namespace funcionam sem ele, mas incluir
torna seu pacote explícito e evita ambiguidade, especialmente ao usar importações relativas. P: Meu IDE funciona bem, mas o terminal falha. Por que
R: Os IDEs geralmente definem o diretório de trabalho e o caminho do Python para a raiz do projeto e podem executar arquivos como módulos. contra. As correções:__init__.pyexecute-o como um módulo com
da raiz do projeto, mude para importações absolutas (
) ou crie um ponto de entrada adequado na raiz do projeto python -m package.module) ou crie um ponto de entrada adequado na raiz do projeto
) ou crie um ponto de entrada adequado na raiz do projeto
) ou crie um ponto de entrada adequado na raiz do projeto ) ou crie um ponto de entrada adequado na raiz do projeto python -m mypackage.main) ou crie um ponto de entrada adequado na raiz do projeto from mypackage.helper import x) ou crie um ponto de entrada adequado na raiz do projeto ) ou crie um ponto de entrada adequado na raiz do projeto
🔗 Share this article
✍️ Leave a Comment