Durante toda a minha vida, não consigo fazer com que as importações relativas do python funcionem. Eu criei um exemplo simples de onde ele não funciona:
A estrutura de diretórios é:
/__init__.py
/start.py
/parent.py
/sub/__init__.py
/sub/relative.py
/start.py
contém apenas: import sub.relative
/sub/relative.py
contém apenas from .. import parent
Todos os outros arquivos estão em branco.
Ao executar o seguinte na linha de comandos:
$ cd /
$ python start.py
Eu recebo:
Traceback (most recent call last):
File "start.py", line 1, in <module>
import sub.relative
File "/home/cvondrick/sandbox/sub/relative.py", line 1, in <module>
from .. import parent
ValueError: Attempted relative import beyond toplevel package
Estou usando o Python 2.6. Por que esse é o caso? Como faço para que este exemplo de sandbox funcione?
Se você deseja ligar
relative.py
diretamente e, por exemplo, se realmente deseja importar de um módulo de nível superior, é necessário adicioná-lo explicitamente àsys.path
lista.Aqui está como deve funcionar:
Se você acha que o exposto acima pode causar algum tipo de inconsistência, use-o:
sys.path[0]
refere-se ao caminho do qual o ponto de entrada foi executado.fonte
Verificando em python3:
Exemplo 1:
Se rodarmos assim (apenas para garantir que PYTHONPATH esteja vazio):
Resultado:
Se alterarmos a importação em
sub/relative.py
Se rodarmos assim:
Resultado:
Example2:
Execute-o como:
Resultado:
Se alterarmos a importação em
sub/start.py
:Execute-o como:
Resultado:
Execute-o como:
Resultado:
Também é melhor usar a importação da pasta raiz, ou seja:
Execute-o como:
Resultado:
fonte