Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python error: AttributeError: 'module' object has no attribute

Tags:

python

package

I'm totally new to Python and I know this question was asked many times, but unfortunately it seems that my situation is a bit different... I have created a package (or so I think). The catalog tree is like this:

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

In parenthesis there are files in the catalog. Both __init__.py files are zero length.

The file mydir/lib/mod1/mod11.py contains the following:

def mod12():     print "mod12" 

Now, I run python, then import lib, which works OK, then lib.mod11() or lib.mod12().

Either of the last two gives me the subject error message. Actually dir(lib) after Step 2 does not display mod11 or mod12 either. It seems I'm missing something really simple.

(I'm using Python 2.6 in Ubuntu 10.10)

Thank you

like image 371
Alex Avatar asked Feb 02 '11 06:02

Alex


2 Answers

When you import lib, you're importing the package. The only file to get evaluated and run in this case is the 0 byte __init__.py in the lib directory.

If you want access to your function, you can do something like this from lib.mod1 import mod1 and then run the mod12 function like so mod1.mod12().

If you want to be able to access mod1 when you import lib, you need to put an import mod1 inside the __init__.py file inside the lib directory.

like image 68
Noufal Ibrahim Avatar answered Sep 21 '22 05:09

Noufal Ibrahim


More accurately, your mod1 and lib directories are not modules, they are packages. The file mod11.py is a module.

Python does not automatically import subpackages or modules. You have to explicitly do it, or "cheat" by adding import statements in the initializers.

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

An alternative is to use the from syntax to "pull" a module from a package into you scripts namespace.

>>> from lib.pkg1 import mod11 

Then reference the function as simply mod11.mod12().

like image 27
Keith Avatar answered Sep 19 '22 05:09

Keith