A Python module and package loading confusion

python, python-3.x, python-module

Solution

Submodules are not automatically attributes of a package until imported.

You need to import `test.models.foo.baby` first before `foo.baby.Baby` works. You can do this in the `foo/__init__.py` file:

from . import baby

Problem

Let's say I have something like this: ``` . ├── run.py └── test ├── __init__.py ├── models │   ├── foo │   │   ├── baby.py │   │   └── __init__.py │   ├── __init__.py │   └── user.py └── start.py ``` run.py ``` from test import start ``` start.py ``` from .models import user ``` user.py ``` from . import foo print(foo.baby.Baby) ``` baby.py ``` Baby = "I am a baby" ``` Now, when you run the `run.py` file... ``` >>> python run.py ... traceback ... AttributeError: 'module' object has no attribute 'baby' ``` But, if you change the `start.py` like this: ``` from .models.foo import baby from .models import user ``` everything works correctly. When the `baby` module in `start.py` wasn't loaded earlier, the `foo` package object did not have a reference to it (`foo.baby.Baby` threw an `AttributeError`). But when I loaded the `baby` module in `start.py`, the `foo` package object automatically got a reference to `baby`module. Can someone explain me how this works?

Original source