¿Alguien puede explicar las importaciones relativas de Python?


Answers

Si va a llamar a relative.py directamente, es decir, si realmente desea importar desde un módulo de nivel superior, debe agregarlo explícitamente a la lista sys.path .
Así es como debería funcionar:

# Add this line to the beginning of relative.py file
import sys
sys.path.append('..')

# Now you can do imports from one directory top cause it is in the sys.path
import parent

# And even like this:
from parent import Parent

Si crees que lo anterior puede causar algún tipo de incoherencia, puedes usar esto en su lugar:

sys.path.append(sys.path[0] + "/..")

sys.path[0] hace referencia a la ruta desde la que se ejecutó el punto de entrada.

Question

No puedo, por mi vida, conseguir que las importaciones relativas de Python funcionen. He creado un ejemplo simple de donde 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 puedo hacer que este ejemplo de sandbox funcione?