我的包结构如this:
sound/
├── effects
│ ├── echo.py
│ ├── __init__.py
│ └── reverse.py
├── formats
│ ├── __init__.py
│ ├── waveread.py
│ └── wavewrite.py
└── __init__.py
然后自动加载子模块echo
和reverse
我在我的effects/__init__.py
文件中添加了以下导入语句
from . import echo
from . import reverse
但是,在导入sound.effects
后,我在尝试访问echo
和reverse
时仍然存在NameError:
>>> import sound.effects
>>> echo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'echo' is not defined
>>> reverse
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'reverse' is not defined
我错过了什么吗?
答案 0 :(得分:3)
是。您导入了sound.effects
,但这并未将effects
的内容带入您当前的命名空间。您仍然需要在他们所在的地方引用它们:sound.effects.echo
和sound.effects.reverse
。
如果您只想按名称引用它们,则需要导入这些名称:
from sound.effects import echo, reverse
答案 1 :(得分:1)
基本上这就是Python命名空间的工作方式。
添加:
from . import echo
要effect/__init__.py
将名称echo
导入effect
命名空间。导入模块时,它会执行模块代码,但在模块命名空间中不是主程序命名空间。
在您的示例中,您可以以sound.effect.echo
的形式访问echo,甚至可以将其导入(在主文件中):
from sound.effect import echo