绝对导入:从要导入文件的顶级包开始写起
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.的错)
包内文件不作入口文件使用的话,完全可以在包内调用写相对调用,比较简洁方便