Importación relativa multinivel

Importación relativa multinivel

Tengo la siguiente estructura de carpetas

top\ __init__.py util\ __init__.py utiltest.py foo\ __init__.py foo.py bar\ __init__.py foobar.py 

Quiero acceder desde foobar.py al módulo utiltest.py . Intenté seguir una importación relativa, pero esto no funciona: from ...util.utiltest import *

Siempre obtengo ValueError: Attempted relative import beyond toplevel package

¿Cómo hacer semejante importación multilínea?

    Debe importar foobar desde la carpeta top de la top :

     import top.foo.bar.foobar 

    Esto le dice a Python que top es el paquete de nivel superior. Las importaciones relativas solo son posibles dentro de un paquete.

    Me doy cuenta de que esta es una pregunta antigua, pero creo que la respuesta aceptada probablemente ignora el problema principal con el código del interrogador. No está mal, estrictamente hablando, pero da una sugerencia de que solo por casualidad se resuelve el problema real.

    El problema real es que el archivo foobar.py en top\foo\bar se está ejecutando como un script. Cuando se intenta una importación relativa (¡correcta!), Falla porque el intérprete de Python no entiende la estructura del paquete.

    La mejor solución para esto es ejecutar foobar.py no por nombre de archivo, sino usar el indicador -m al intérprete para indicarle que ejecute el módulo top.foo.bar.foobar . De esta manera, Python sabrá el módulo principal que está cargando en un paquete, y sabrá exactamente dónde se refiere la importación relativa.