__init__.py
的文件夹就是一个包(package),包是组织和管理模块的方式。目录结构如下:
demo是一个文件夹,包含module1.py和module2.py。
name="module1"
from module1 import name
if __name__=="__main__":
print(name)
这样可以直接运行module2.py
打印"moudule1"。
而如果修改module2.py为如下:
from .module1 import name
if __name__ == '__main__':
print(name)
再直接运行会报错:
ImportError: attempted relative import with no known parent package
这是因为使用.
的这种方式是相对引入,使用相对引入的模块不能直接运行。
目录结构如下:
我们在demo
目录中新增了一个空的__init__.py
,这样demo
就是一个包了。
main.py
中使用绝对引入,引入module2
的函数
from demo.module2 import printName
if __name__ == '__main__':
printName()
来看module2的各种使用情况,结果放在注释中,可以解除注释自行尝试。
# 情况1
# from .module1 import name
# """
# 相对引入,直接运行这个文件报错
# ImportError: attempted relative import with no known parent package
# 外层的main.py可以运行。
# """
# 情况2
# from demo.module1 import name
# """
# 绝对引入,但是直接运行报错,当前目录找不到demo包
# 外层的main.py可以运行。
# """
#情况3
# from module1 import name
# """
# 绝对引入,可以直接运行
# 外层的main运行报错,找不到module1
# 因为执行main的时候是从main所在目录直接找module1
# """
def printName():
print(name)
if __name__ == '__main__':
printName()
好的我们现在把main.py所在目录
也变成一个包,同时修改为相对引入如图:
现在运行main.py
报错,这还是是因为使用相对引入导致的,因为你使用相对引入就不能当作主模块直接运行。
目录结构和main.py
如图:
再来看module2
的各种情况
# 情况1
# from .module1 import name
# """
# 直接运行报错
# 相对引入,直接运行这个文件报错
# 外层的main.py可以运行,输出外层的
#
# """
# 情况2
# from demo.module1 import name
# """
# 直接运行则为绝对引入,输出子包demo的module1的name: "inner_module1"
# 外层的main.py可以运行,这是这里的引入就是相对引入了,输出外层的module1的name : "module1"
# """
# 情况3
# from .demo.module1 import name
# """
# 直接运行报错
# 外层的main.py可以运行,为相对引入,输出子包demo的module1的name: "inner_module1"
# """
def printName():
print(name)
if __name__ == '__main__':
printName()