相对导入与绝对导入
1.cd.. 回退到上一层 cd../.. 回退两层
2.from . import module(模块名)
点表示在同一级目录。可以直接相对导入。
3.文件夹被python解释器视为package需要同时满足两个条件:
①·文件夹中必须有__init__文件,文件可以为空,但必须存在。
②·不能作为顶层模块来执行该文件夹中的py文件(即不能作为主函数的入口)
4.跨模块导入补充
创建的目录和包
manage模块
crm模块导入到manage里,
crm
5.绝对导入和相对导入
绝对导入:from a import b 或者直接import b
相对导入:from . import b 或者 from ..a import b
python是根据__name__来决定一个模块在包中的结构的。如果__name__是 __main__则他本身是顶层模块,没有包结构。
如果是a.b.c 结构,则a是顶层模块。
基本上遵循下面的原则:
- 如果是绝对导入,一个模块只能导入自身的子模块或和它的顶层模块同级别的模块及其子模块
- 如果是相对导入,一个模块必须有包结构且只能导入它的顶层模块内部的模块。
如果一个模块被直接运行,则他自己为顶层模块,不存在相对路径。
相对导入可以避免硬编码,对于包的维护是友好的。绝对导入可以避免与标准库命名的冲突,实际上也不推荐自定义模块与标准库命令相同。
相对导入与绝对导入仅用于包内部(包内导入即是包内的模块导入到包内的模块)
绝对导入是直接跳过包内,直接搜索sys·path,在sys·path里进行搜索。
相对导入是先在包内,再在包外搜索。
sys.modules 生成一个字典,查看当前存在的模块。也可以检查导入的模块是否导入成功。
6.
在当前的包内不能用相对导入是因为需要执行的模块python会默认他是一个顶层模块。
用 __name__查看当前函数的类型,显示为main,主函数。
from . import crm crm.sayhi() import sys print(__name__) # from . import crm # ImportError: cannot import name 'crm' # __main__
越是困难的事越要立即去做,这样收益才会最大!!!