很久没有敲代码了,遇到绝对导入和相对导入,一脸懵逼。查阅资料,总算厘清了问题。话不多说,开始我的表演:
一、概念速览
Python的绝对导入和相对导入是管理和组织大型项目中不同模块和包之间依赖关系的重要工具,有助于提高代码的可读性、可维护性和可重用性。导入的关系错综复杂,不花功夫理解和实践,很难掌握、容易出错。
绝对导入:指在导入模块时,提供完整的包或模块的路径名。形式可为import或者from import。
相对导入:指在导入模块时,使用相对于当前模块的路径。使用点.
表示当前包,使用点点..
表示上级包。只能用from import形式。
模块(module):目录下的.py文件。
包(package):理解成文件夹。
二、准备工作
(在Windows平台的vs code下开展)
创建目录树和模块(.py)
即ALL文件夹下有子文件夹A和B
A下面有A1文件夹,A1文件夹内有模块utilA.py
B下面有B1文件夹以及模块main.py(程序入口),B1文件夹内有模块utilB.py
main.py,utilA.py和utilB.py三个模块的代码如下:
# main.py
from B1 import utilB
print(utilB.blueB())
# utilA.py
def blueA():
return 100
# utilB.py
def blueB():
return 0
三、干货
1. main入口不能使用相对导入,只能够使用绝对导入;
例如把main.py改为相对导入:
# main.py
from .B1 import utilB
print(utilB.blueB())
就会报错:ImportError: attempted relative import with no known parent package
2. 绝对导入和相对导入均只适用于main.py入口所在的上一级目录下的其他模块,因此main.py可以导入utilB.py,而不能直接导入utilA.py,否则会报错:ModuleNotFoundError: ...
运行原先的main.py,得到结果0,说明导入utilB.py成功!
3. 如果非要从main.py导入任何不在其上一级目录下的模块(如utilA.py),可以把main.py改成:
# main.py
import sys
sys.path.append(r"C:\Users\wokao\Desktop\ALL\A\A1")
import utilA
print("main_name="+__name__)
print(utilA.blueA())
其中C:\Users\wokao\Desktop\ALL\A\A1为本例utilA.py的地址,应替换成读者放置utilA的实际地址(鼠标指向资源管理器中的utilA.py,然后右键点击鼠标,选择“复制文件地址”,再粘贴到r后面即可)。运行main.py,可以看到输出为100,说明调用utilA.py中的blue()函数成功!
四、ps:
才疏学浅,以上内容若有误,请不吝指出。
站在巨人肩上,我们能够望得更远!
赠人玫瑰,手留余香。