I have a directory with a number of .py files in it. each file defines some classes. I also have an empty __init__.py in the directory.
For example:
myproject
__init__.py
mymodule
__init__.py
api.py
models.py
views.py
I am trying to import mymodule and access the classes defined in all these files:
from myproject import mymodule print mymodule.api.MyClass
It gives me an error saying that mymodule has no attribute api. Why? And why I can access just one of the files (models.py) and not the others?
In [2]: dir(banners) Out[2]: ['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'models']
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
The problem is submodules are not automatically imported. You have to explicitly import the api module:
import myproject.mymodule.api print myproject.mymodule.api.MyClass
If you really insist on api being available when importing myproject.mymodule you can put this in myproject/mymodule/__init__.py:
import myproject.mymodule.api
Then this will work as expected:
from myproject import mymodule print mymodule.api.MyClass
Method 2
If you are an idiot, like me, then also check whether you didn’t name your python file the same as the module you are trying to import.
Method 3
Modules don’t work like that.
from myproject.mymodule import api print api.MyClass
Method 4
You need an __init__.py in the myproject directory too. So your module structure should be:
myproject
__init__.py
mymodule
__init__.py
api.py
models.py
views.py
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0