Python 中支持相对导入语法, 即可以相对于某一个 package 进行导入, 具体语法如下:
- # 导入 "./dir2/spam.py", . 表示当前目录
- from .dir2 import spam
- # 导入 "./../dir3/spam.py", . 表示当前目录, .. 表示上一级目录
- from ..dir3 import spam
要使用相对导入语法, 必须满足以下 3 个条件:
1 该语法只能在 package 中使用 (即使用该语法的文件位于可以位于一个普通的 package 中 < 包含__init__.py>, 也可以位于一个 namespace package 中), 否则导入失败;
2 只有 from 有相对导入语法, import 没有
3 要使用相对导入语法, 目录前面必须有. 或者.., 否则, 对于 Python 2.X 和 Python 3.X 来说行为还有少许差别, 下面提到.
绝对导入与相对导入
所谓绝对导入, 就是只在 sys.path 的路径进行搜寻导入的 package 或者 module 文件;
所谓相对导入, 就是只在当前 package 下进行搜寻导入的 package 或者 module 文件;
需要记住的是, 只要使用了相对导入的语法, 无论是在 Python 2.X, 还是 Python 3.X 中, 都只会在当前目录进行搜寻. 如果不使用相对导入语法, 那么:
1 对于 Python 3.X 来说, import 和 from 语法只进行绝对导入的搜寻;
2 对于 Python 2.X 来说, import 和 from 语法先进行相对导入的搜寻, 如果没有搜索到, 再进行绝对导入的搜寻
那如果 Python 2.X 也想达到和 Python 3.X 一样的效果, 即如果使用了相对导入, 就只在当前 package 下进行搜寻, 否则, 就使用绝对导入的搜寻, 该怎么办呢? 如果真要这样, 可以在 module 文件的第一行, 加入如下语句:
from __future__ import absolute_import
那么, 对于 Python 2.X, 无论是 import 还是 ffrom, 只要没使用相对导入, 都只进行绝对导入的搜寻.
来源: http://www.bubuko.com/infodetail-2695819.html