Johannes Griebler
Johannes Griebler

Reputation: 21

Can't import python module from a subdirectory with a simple import statement

So I want to import a module from a python package that is a subdirectory of the one where the main script is located. This is the directory structure:

maindir \
  - main.py
  - modules \
    - __init__.py
    - module.py

What I find weird is that I can't import module.py with a simple import modules.module, because when I then try to call the function module.foo() in main.py it returns NameError: name 'module' is not defined. However, when I do import modules.module as module, everything works fine, the same with from modules import module. And when module.py is located in the same directory as main.py, a simple import module is completely sufficient for calling module.foo().

Now the question is, why is that? Why isn't a simple import statement enough for importing a module from a package instead of the directory the script is in? Or am I doing something else wrong? An answer would be really appreciated since I am rather confused right now...

Upvotes: 1

Views: 2192

Answers (2)

Matt Alcock
Matt Alcock

Reputation: 12911

When you import you still need to use the full package syntax to use the function foo.

The below should work

import modules.module
modules.module.foo() 

A better way to do this is

from modules import module
module.foo()

A third less elegant way (but exactly the same as the above) is:

import modules.module as module
module.foo()

Upvotes: 2

BrenBarn
BrenBarn

Reputation: 251618

It does import the module, it just doesn't make its name directly accessible. When you do import foo.bar, the name that is imported is foo, and bar is only accessible as an attribute of that. You use that form of import if that is what you want; that's what it's for. If you don't want that, use a different form of the import statement.

If you want to be able to type module instead of modules.module, either do import modules.module as module, as you found, or do from modules import module.

Upvotes: 2

Related Questions