之前对包或模块的导入非常迷糊,特别是相对导入。下面贴出网上找的的两篇还不错的文章进行分享:
一、包的相对和绝对导入
我们的最顶级包base是写给别人用的,然后在base包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式:
绝对导入:以base作为起始
相对导入:用 . 或者 .. 的方式最为起始(只能在一个包中使用,不能用于不同目录内)
1. 绝对导入
在demo01中的demo01_test02.py中调用demo02中的模块
from base.demo01 import demo01_test01
demo01_test01.say()
在 base目录下的py文件中调用demo01_test02.py
from base.demo01 import demo01_test02
demo01_test02.demo01_test01.say()
2.相对导入
在demo01中的demo01_test02.py中调用demo02中的模块
from ..demo02.demo02_test01 import say21
say21()
在 base目录下的py文件中调用demo01_test02.py
from base.demo01 import demo01_test02
demo01_test02.say21()
import sys
print(sys.path)
'''
啦啦啦
呜呜呜
demo02_test01_hello
demo02_test01_hello
['D:\\pycharm工作空间\\day12\\base', 'D:\\pycharm工作空间\\day12', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\python36.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\win32', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\win32\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\Pythonwin', 'C:\\Program Files\\JetBrains\\PyCharm 2018.3.2\\helpers\\pycharm_matplotlib_backend']
'''
相对路径运行注意事项:
在没有明确指定包结构的情况下,Python 是根据 __name__ 来决定一个模块在包中的结构的,如果是 __main__ 则它本身是顶层模块,没有包结构,如果是base.demo01.demo02 结构,那么顶层模块是 base。
如果是相对导入,一个模块必须有包结构且只能导入它的顶层模块内部的模块
如果一个模块被直接运行,则它自己为顶层模块,不存在层次结构,所以找不到其他的相对路径。
参考文章: