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?
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
来源:https://stackoverflow.com/questions/16201068/a-python-module-and-package-loading-confusion