Por mi vida no puedo conseguir que las importaciones relativas de Python funcionen. He creado un ejemplo simple de dónde no funciona:
La estructura del directorio es:
/__init__.py
/start.py
/parent.py
/sub/__init__.py
/sub/relative.py
/start.py
contiene solo: import sub.relative
/sub/relative.py
contiene solo from .. import parent
Todos los demás archivos están en blanco.
Al ejecutar lo siguiente en la línea de comando:
$ cd /
$ python start.py
Yo obtengo:
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
Estoy usando Python 2.6. ¿Por qué es este el caso? ¿Cómo hago que este ejemplo de sandbox funcione?
Si va a llamar
relative.py
directamente, es decir, si realmente desea importar desde un módulo de nivel superior, debe agregarlo explícitamente a lasys.path
lista.Así es como debería funcionar:
Si cree que lo anterior puede causar algún tipo de inconsistencia, puede usar esto en su lugar:
sys.path[0]
se refiere a la ruta desde la que se ejecutó el punto de entrada.fuente
Comprobándolo en python3:
Ejemplo 1:
Si lo ejecutamos así (solo para asegurarnos de que PYTHONPATH esté vacío):
Salida:
Si cambiamos la importación en
sub/relative.py
Si lo ejecutamos así:
Salida:
Ejemplo2:
Ejecútalo como:
Salida:
Si cambiamos la importación en
sub/start.py
:Ejecútalo como:
Salida:
Ejecútalo como:
Salida:
También es mejor usar la importación desde la carpeta raíz, es decir:
Ejecútalo como:
Salida:
fuente