2011-11-16 13 views
5

Tengo un proyecto que se parece a esto:Python importación absoluta en el módulo falla

my_project/ 
      __init__.py -- empty 
      run.py 
      datacheck/ 
        __init__.py -- empty 
        datacheck.py -- containing class DataCheck(object) 
        config.py -- containing BusinessConfig(object) 
        business.py -- containing class BusinessCheck(DataCheck) 

Mi PYTHONPATH está configurado para tener/mi_proyecto en ella.

En run.py, tengo el siguiente código:

from datacheck.business import BusinessCheck 
business = BusinessCheck() 
business.check_data() 

En business.py, tengo las siguientes importaciones que fallan:

from datacheck.config import BusinessConfig 
from datacheck.datacheck import DataCheck 

Un relativa de las importaciones como from .config import BusinessConfig trabajos - sin embargo, He leído en numerosos hilos que se prefiere una importación absoluta.

hacer una prueba sencilla, también creé la siguiente:

myproject/ 
      __init__.py -- empty 
      run_test.py 
      test/ 
       __init__.py -- empty 
       test1.py -- containing class Test1(object) 
       test2.py -- containing class Test2(Test1) 

importaciones run_test.py y se ejecuta la clase Test2, esto no falló.

Me dejó un poco atónito, no entiendo por qué mis importaciones absolutas en la comprobación de datos no funcionan, ¿alguien puede explicarlo?

+0

'from datacheck.business import Business' pero' business.py - que contiene la clase BusinessCheck (DataCheck) '... ¿Dónde está la clase' Business'? – eumiro

+0

¿Tiene un archivo '__init __. Py' en' datacheck' también? Este archivo hace que el directorio sea un paquete y puede estar vacío. –

+0

@eumiro: Lo siento, pequeño error, corríjalo. –

Respuesta

6

Debe preferir las importaciones absolutas si su módulo se puede usar como __main__, como se explica en el documentation. Si no, las importaciones relativas están bien.

Estas importaciones fallan, porque su paquete datacheck contiene un módulo datacheck (mismo nombre). Al buscar el nombre, Python busca implícitamente dentro del paquete primero. Allí, encuentra el módulo datacheck. Sin embargo, este módulo no contiene nada con el nombre config, por lo que la importación falla.

Si desea utilizar importaciones absolutas, mueva todas las cosas del módulo datacheck al __init__.py del paquete, o cambie el nombre.

+0

Eso (comprobación de datos en la comprobación de datos) fue todo el tiempo, ¡nunca supe que esto no era posible! Muchas gracias :-) –

+0

@SjaakTrekhaak: Es posible, pero crea una ambigüedad, por lo que hay que tener mucho cuidado. –

2

Sé que esto es muchos años más tarde, pero por el bien de los demás busca aquí, yo era capaz de resolver un problema similar con este trozo de código:

from __future__ import absolute_import 

Después de eso, las importaciones absolutos trabajaron bien en Python 2.6 y 2.7.

Cuestiones relacionadas