2012-01-17 12 views
22

Tengo un directorio con un número de archivos .py en él. cada archivo define algunas clases. También tengo un __init__.py vacío en el directorio.módulo no tiene atributo

Por ejemplo:

myproject 
    __init__.py 
    mymodule 
     __init__.py 
     api.py 
     models.py 
     views.py 

Estoy tratando de importar mymodule y acceder a las clases definidas en todos estos archivos:

from myproject import mymodule 

print mymodule.api.MyClass 

Me da un error que dice que mymodule tiene ningún atributo api. ¿Por qué? ¿Y por qué puedo acceder solo a uno de los archivos (models.py) y no a los demás?

In [2]: dir(banners) 
Out[2]: 
['__builtins__', 
'__doc__', 
'__file__', 
'__name__', 
'__package__', 
'__path__', 
'models'] 

Respuesta

28

El problema es que los submódulos no se importan automáticamente. Usted tiene que importar de forma explícita el módulo api:

import myproject.mymodule.api 
print myproject.mymodule.api.MyClass 

Si realmente insiste en api estar disponible al importar myproject.mymodule se puede poner esto en myproject/mymodule/__init__.py:

import myproject.mymodule.api 

entonces esto va a funcionar como se espera:

from myproject import mymodule 

print mymodule.api.MyClass 
1

Los módulos no funcionan así.

from myproject.mymodule import api 
print api.MyClass 
+0

Sé que puedo hacer eso. ¿Es posible usar los nombres punteados? – akonsu

+2

@akonsu, simplemente haga 'import myproject.mymodule.api' luego y acceda a través de' myproject.mymodule.api.MyClass'. –

+0

bueno, creo que esta es una pregunta sobre el lenguaje en general, no sobre cómo puedo hacer que mi código funcione. Tengo curiosidad sobre si esto puede lograrse. ¿Puedo hacer que acceda a mis clases a través de 'mymodule.api ...' sin el 'myproject' líder? – akonsu

2

Hace falta un programa __init__.py en el directorio miproyecto también. Por lo tanto, la estructura de su módulo debe ser:

myproject 
    __init__.py 
    mymodule 
     __init__.py 
     api.py 
     models.py 
     views.py 
+1

sí gracias, lo tengo, simplemente se omite de la pregunta. – akonsu

Cuestiones relacionadas