无法通过简单导入语句从子目录导入Python模块

1 投票
2 回答
2162 浏览
提问于 2025-04-17 13:51

我想从一个Python包中导入一个模块,而这个包是主脚本所在目录的一个子目录。下面是目录结构:

maindir \
  - main.py
  - modules \
    - __init__.py
    - module.py

我觉得奇怪的是,我不能用简单的 import modules.module 来导入 module.py,因为当我在 main.py 中尝试调用 module.foo() 时,它会返回 NameError: name 'module' is not defined 的错误。不过,当我使用 import modules.module as module 时,一切都正常,使用 from modules import module 也是一样。而当 module.pymain.py 在同一个目录时,简单的 import module 就足够调用 module.foo() 了。

现在问题是,为什么会这样呢?为什么简单的 import 语句在从包中导入模块时不够,而在脚本所在的目录中却可以?或者我是不是做错了什么?如果能得到一个答案我会非常感激,因为我现在有点困惑……

2 个回答

2

当你导入一个包的时候,还是需要用完整的包语法来调用函数 foo。

下面的写法应该可以正常工作:

import modules.module
modules.module.foo() 

更好的做法是:

from modules import module
module.foo()

还有一种不太优雅的方式(但和上面的一样)是:

import modules.module as module
module.foo()
2

它确实导入了这个模块,只是没有直接让它的名字可以用。比如你用 import foo.bar 这个命令,导入的名字是 foo,而 bar 只能作为 foo 的一个属性来访问。你选择这种导入方式是因为你想要这样,这就是它的用途。如果你不想这样,可以使用其他的导入方式。

如果你想直接输入 module 而不是 modules.module,你可以用 import modules.module as module,就像你发现的那样,或者用 from modules import module

撰写回答