Python 自动加载子模块时发生NameError

Python 自动加载子模块时发生NameError,python,python-3.5,Python,Python 3.5,我的包结构如下: 然后,为了自动加载子模块echo和reverse,我将以下导入语句添加到我的effects/\uuuu init\uuuuu.py文件中 from . import echo from . import reverse 但是,在导入sound.effects之后,在尝试访问echo和reverse时,我仍然有一个名称错误: >>> import sound.effects >>> echo Traceback (most recent ca

我的包结构如下:

然后,为了自动加载子模块
echo
reverse
,我将以下导入语句添加到我的
effects/\uuuu init\uuuuu.py
文件中

from . import echo
from . import reverse
但是,在导入
sound.effects之后,在尝试访问
echo
reverse
时,我仍然有一个名称错误:

>>> 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
>>导入声音效果
>>>回音
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
名称错误:未定义名称“echo”
>>>逆转
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“reverse”

我错过什么了吗?

是的。您导入了
sound.effects
,但这不会将
effects
的内容带入当前名称空间。您仍然需要在它们所在的位置引用它们:
sound.effects.echo
sound.effects.reverse

如果只想按名称引用这些名称,则需要导入这些名称:

from sound.effects import echo, reverse

对。您导入了
sound.effects
,但这不会将
effects
的内容带入当前名称空间。您仍然需要在它们所在的位置引用它们:
sound.effects.echo
sound.effects.reverse

如果只想按名称引用这些名称,则需要导入这些名称:

from sound.effects import echo, reverse

基本上,Python名称空间就是这样工作的

添加:

from . import echo
To
effect/\uuuuu init\uuuuuuupy
将名称
echo
导入
effect
命名空间。导入模块时,它会执行模块代码,但在模块名称空间中,而不是在主程序名称空间中

在您的示例中,您可以通过
sound.effect.echo
访问echo,甚至可以通过以下方式导入它(在主文件中):


基本上,Python名称空间就是这样工作的

添加:

from . import echo
To
effect/\uuuuu init\uuuuuuupy
将名称
echo
导入
effect
命名空间。导入模块时,它会执行模块代码,但在模块名称空间中,而不是在主程序名称空间中

在您的示例中,您可以通过
sound.effect.echo
访问echo,甚至可以通过以下方式导入它(在主文件中):


也许我不够清楚。我知道我可以像那样导入它们,但我想利用这样一个事实,即可以使用
\uuuu init\uuuu.py
来执行初始化代码不,您已经非常清楚了。然后您将这些名称导入到
\uuuu init\uuuuu.py
中。但这并不能使它们在其他任何地方都可用。这就是Python的工作原理。也许我还不够清楚。我知道我可以像那样导入它们,但我想利用这样一个事实,即可以使用
\uuuu init\uuuu.py
来执行初始化代码不,您已经非常清楚了。然后您将这些名称导入到
\uuuu init\uuuuu.py
中。但这并不能使它们在其他任何地方都可用。这就是Python的工作原理。