绝对导入
没有 . 或者..的导入就是绝对导入
绝对导入的路径就是从top-level 一层一层往下数
top-level
哪个作为主程序直接运行,那这个模块所在的目录就是top-level
当前在mod.py文件中,所以mod文件是主程序,跟mod文件同级的pack01、pack02模块就是top-level层
from pack01.subpack01 import subpk01
相对导入
模块路径由 . 开始的导入就是相对导入
. 表示当前这一级,.. 表示上一级,... 表示上上级,依次类推
相对导入不能识别到top-level那一层,只能识别到top-level以下层
subpk01模块:
print("i am subpk01")
from ..subpack02 import subpk02
subpk02模块:
print("i am subpk02")
此时不能直接运行subpk01模块,会报错:
from ..subpack02 import subpk02
ImportError: attempted relative import with no known parent
因为在subpk01模块中使用了相对路径导入subpk02,而此时运行subpk01模块说明subpk01是主程序,此时的top-level是subpk01,相对导入只能识别到top-level以下层,所以会报出导入错误
但是可以在mod模块中导入subpk01模块,因为此时mod作为主程序,是top-level,pack01也是top-level,所以subpk01的上一级subpack02也在top-level以下层,可以识别到,所以在mod模块中再导入subpk01模块不会报错:
from pack01.subpack01 import subpk01
# i am subpk01
# i am subpk02
如果将subpk01模块中改为:
print("i am subpk01")
from ...pack01.subpack02 import subpk02
然后在mod模块中导入,会报错
因为…表示subpk01模块的上两级pack01,而pack01与mod同级,是top-level,不能识别到pack01这一级
from pack01.subpack01 import subpk01
# from ...pack01.subpack02 import subpk02
# ValueError: attempted relative import beyond top-level package
subpk01中也可以绝对导入subpk02模块:
print("i am subpk01")
from pack01.subpack02 import subpk02
运行mod文件:
from pack01.subpack01 import subpk01
# i am subpk01
# i am subpk02