2011-02-02 13 views
29

Soy totalmente nuevo en Python y sé que esta pregunta fue hecha muchas veces, pero desafortunadamente parece que mi situación es un poco diferente ... He creado un paquete (o eso creo). El árbol de catálogo es de esta manera:Error de Python: AttributeError: el objeto 'module' no tiene ningún atributo

mydir 
    lib  (__init__.py) 
    mod1 (__init__.py, mod11.py) 

Entre paréntesis hay archivos en el catálogo. Ambos archivos __init__.py son de longitud cero. El archivo mydir/lib/mod1/mod11.py contiene lo siguiente:

def mod12(): 
    print "mod12" 

Ahora, corro python, entonces import lib, que funciona bien, entonces lib.mod11() o lib.mod12(). Cualquiera de los dos últimos me da el mensaje de error del sujeto. En realidad, dir(lib) después del paso 2 no muestra mod11 o mod12 tampoco. Parece que me estoy perdiendo algo realmente simple. (estoy usando Python 2.6 en Ubuntu 10.10)

Gracias

+1

El mensaje de error en el asunto está incompleto. Puede ser útil publicar el mensaje de error completo aquí en el cuerpo. – Keith

Respuesta

5

La forma en que lo haría es dejar los archivos init__.py __ vacía, y hacer:

import lib.mod1.mod11 
lib.mod1.mod11.mod12() 

o

from lib.mod1.mod11 import mod12 
mod12() 

Es posible que el mod1 dir no sea necesario, solo tenga mod12.py en lib.

29

Cuando import lib, está importando el paquete. El único archivo para evaluar y ejecutar en este caso es el byte __init__.py de 0 en el directorio lib.

Si desea tener acceso a la función, se puede hacer algo como esto from lib.mod1 import mod1 y vuelva a ejecutar la función mod12 al igual que mod1.mod12().

Si desea poder acceder a la mod1 al importar lib, es necesario poner import mod1 dentro del archivo __init__.py dentro del directorio lib.

22

Más exactamente, sus directorios mod1 y lib no son módulos, son paquetes. El archivo mod11.py es un módulo.

Python no importa subpaquetes o módulos automáticamente. Tienes que hacerlo explícitamente, o "hacer trampa" al agregar instrucciones de importación en los inicializadores.

>>> import lib 
>>> dir(lib) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__'] 
>>> import lib.pkg1 
>>> import lib.pkg1.mod11 
>>> lib.pkg1.mod11.mod12() 
mod12 

Una alternativa es utilizar la sintaxis from a "tirar" un módulo de un paquete en usted las secuencias de comandos de espacio de nombres.

>>> from lib.pkg1 import mod11 

Luego haga referencia a la función como simplemente mod11.mod12().

4

Mi solución se puso esas importaciones en __init__.py de lib:

in file: __init__.py 
import mod1 

Entonces,

import lib 
lib.mod1 

funcionaría bien.

Cuestiones relacionadas