python包的相对导入和绝对导入

绝对导入:从要导入文件的顶级包开始写起

print(__package__)  # 打印出该文件所在包的路径

以下面所示项目文件结构为例:

# ​​顶级包一般是项目文件夹中最上层的包,比如说a,b中的模块的顶级包就分别是a,b
# a1中
print(__package__)  >>  a

# b1中
print(__package__)  >>  b

# bb1中 
print(__package__)  >>  b.bb  # 则 bb1 的顶级包就是b

# csdn中
print(__package__)  >>  None  # 该模块(.py文件)直接在项目文件夹下,无顶级包,所以一般都是将入口文件放在项目文件夹下,最外层一般不相互调用
# 绝对调用时
form b.bb import bb1  # 调用bb1

相对导入: 

.  # 当前包
..  # 上一级包
...  # 上上一级
# 在b1中导入b2
form . import b2

# 在bb1中导入b1
from .. import b1

注意:

1. 入口文件(即运行开始的文件)不可使用相对导入

# 运行a2.py相对调用同级的a1.py
from . import a1

错误原因:入口文件在编译时会被python自动命名成__main__,你是找不到 . 作为本级文件夹的

2. 绝对导入一定要从顶级包开始

我一般都直接采用顶级调用(包内文件层级较少的情况,而且我喜欢在模块中写一个自己的验证程序,所以相对调用老是报1.的错)

包内文件不作入口文件使用的话,完全可以在包内调用写相对调用,比较简洁方便

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章