包含了
__init__.py
文件夹的称为包
一、导入模块的语法
import <>
from <> import <>,<>
from <> import *
(不建议使用)
import <> as <>
(别名)
目录树例子
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
moduleA.py
二、 Python中的相对导入和绝对导入
绝对导入
- 最常见的导入方式
- 绝对导入可以使用
import <>
或from <> import <>
这两种语法 - 从顶层包向下以
.
连接
import package.subpackage1.moduleX as moduleX
from package.subpackage1 import moduleY
from subpackage2 import moduleZ
- 在当前模块中引入同级别的模块或者同级别的包下的模块的时候,最好把导入路径写完整
# moduleX.py
import moduleY
# moduleA.py
import package.subpackage1.moduleX
会在 moduleA
的视角寻找导入的moduleX
中导入的moduleY
ModuleNotFoundError: No module named ‘moduleY‘
绝对导入的缺点
- 导入同一个包下的模块需要写完整的导入路径,如果层级很深,这个路径会显得很长。(路径长)
- 假如要改变层级较高的包名,比如*包,那么所有导入路径都要改。(修改不便)
相对导入
-
同一个包下的模块可以很方便的相互引用,
.
代表本层目录,..
代表上层目录,以此类推。 -
顶层包的包名改了,包下的模块的相对导入的语句基本不用改。
-
相对导入只能使用
from <> import <>
,在subpackage1/moduleX.py
中,可以使用如下方式导入
from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
- 通过
__package__
可以查询顶包是哪个
目录树例子
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
moduleA.py
Python导入规则
- 相对导入只适用于*包内的模块
在模块 moduleY
中引入 subpackage2
包下的 moduleZ
模块:
# moduleY.py
from ..subpackage2 import moduleZ
执行文件 moduleA.py
的代码:
# moduleA.py
import subpackage1.moduleY
ValueError: attempted relative import beyond top-level package
因为模块 moduleY
所在的*包是 subpackage1
,而 subpackage1
包下不存在子包 subpackage2
。
- 使用了相对导入的模块文件不能作为顶层执行文件
执行 python moduleX.py
将会引发 ModuleNotFoundError: No module named ‘__main__.moduleY‘; ‘__main__‘ is not a package
异常。
# moduleX.py
from .moduleY import *