2010-11-14 22 views
27

Hola a todos: me estoy tirando de pelos con las importaciones relativas en Python. He leído la documentación 30 veces y numerosas publicaciones aquí en SO y otros foros, parece que todavía no funciona.Importaciones relativas en Python

Mi estructura de directorios Actualmente tiene este aspecto

src/ 
    __init__.py 
    main.py 
    components/ 
     __init__.py 
     expander.py 
     language_id.py 
    utilities/ 
     __init__.py 
     functions.py 

Quiero expander.py y language_id.py tener acceso al módulo de funciones. Ejecuto python main.py que accede a los módulos muy bien desde components.expander import * y components.language_id import *.

Sin embargo, el código dentro de expansión y language_id para acceder al módulo de funciones:

from ..utilities.functions import * 

recibo este error:

ValueError: Attempted relative import beyond toplevel package 

he repasado un montón de veces y parece sigue la documentación. Alguien tiene alguna idea de lo que está mal aquí?

+8

Ya ha encontrado la solución, pero para explicar por qué es necesaria: el paquete debe ser completamente independiente. No tratará src/como un paquete cuando ejecute main.py dentro de él. –

Respuesta

21

No importa, lo resolvió:

src/ 
    main.py 
    mod/ 
     __init__.py 
     components/ 
      __init__.py 
      expander.py 
      language_id.py 
     utilities/ 
      __init__.py 
      functions.py 

main.py a continuación se refiere a los subpaquetes como:

from mod.components.expander import * 
from mod.utilities.functions import * 

expander.py y language_id.py tener acceso a functions.py con:

from ..utilities.functions import * 

Pero lo interesante es que tenía un archivo de texto dentro del directorio de componentes que expander.py us es. Sin embargo, en tiempo de ejecución no pudo ubicar el archivo aunque estaba en el mismo directorio. Moví el archivo de texto al mismo directorio que main.py y funcionó. Parece contra-intuitivo.

+13

Todo el nuevo módulo de importación está roto y no es intuitivo. –

+3

La apertura de archivos de texto funciona desde el directorio de trabajo donde se inició el programa, mientras que la importación es relativa a la ubicación del script. Puede usar \ _ \ _ archivo \ _ \ _ en un módulo para encontrar su ruta y, por lo tanto, hacer referencia a elementos en el mismo directorio, aunque no es muy elegante. Si el archivo de texto es datos estáticos para el programa, podría ser más fácil convertirlo en un módulo de Python e importarlo. –

+1

Puede usar 'pkgutil.get_data()' (http://docs.python.org/library/pkgutil#pkgutil.get_data) para recuperar archivos usando el espacio de nombres del módulo para ubicarlos. Por ejemplo, 'raw_data = pkgutil.get_data ('mod.components', 'data.txt')' recuperará los datos binarios en bruto del archivo. – ncoghlan

Cuestiones relacionadas