无法通过简单导入语句从子目录导入Python模块
我想从一个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.py
和 main.py
在同一个目录时,简单的 import module
就足够调用 module.foo()
了。
现在问题是,为什么会这样呢?为什么简单的 import
语句在从包中导入模块时不够,而在脚本所在的目录中却可以?或者我是不是做错了什么?如果能得到一个答案我会非常感激,因为我现在有点困惑……
2 个回答
当你导入一个包的时候,还是需要用完整的包语法来调用函数 foo。
下面的写法应该可以正常工作:
import modules.module
modules.module.foo()
更好的做法是:
from modules import module
module.foo()
还有一种不太优雅的方式(但和上面的一样)是:
import modules.module as module
module.foo()
它确实导入了这个模块,只是没有直接让它的名字可以用。比如你用 import foo.bar
这个命令,导入的名字是 foo
,而 bar
只能作为 foo
的一个属性来访问。你选择这种导入方式是因为你想要这样,这就是它的用途。如果你不想这样,可以使用其他的导入方式。
如果你想直接输入 module
而不是 modules.module
,你可以用 import modules.module as module
,就像你发现的那样,或者用 from modules import module
。