2012-02-14 9 views
16

relativa de las importaciones de varios nivelesmultinivel relativa de las importaciones

He 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 el módulo foobar.pyutiltest.py. He intentado siguiente relativa de las importaciones, pero esto no funciona: from ...util.utiltest import *

Siempre me ValueError: Attempted relative import beyond toplevel package

Cómo realizar una importación relativa, multileve?

+1

¿por qué importa relativa? una importación absoluta debería ser la forma más fácil de hacerlo;): 'from util.utiltest import *' –

Respuesta

12

Debe importar foobar de la carpeta principal de 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.

11

Me doy cuenta de que esta es una pregunta antigua, pero creo que la respuesta aceptada probablemente omita el problema principal con el código del interrogador. No está mal, hablando en sentido estricto, pero da una sugerencia que casualmente resulta que funciona en torno al problema real.

Ese problema real es que el archivo foobar.py en top\foo\bar se está ejecutando como una secuencia de comandos. Cuando se intenta una importación relativa (correcta), falla porque el intérprete de Python no comprende la estructura del paquete.

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

Cuestiones relacionadas