文章目录
- import机制
- 入口文件
- 绝对导入和相对导入
- 绝对导入
- 相对导入
- 解决import报错问题
- 小结
import机制
在我们执行python文件时,python通过sys.path进行路径搜索的,整体来说,分为三种搜索模式
1.#系统的内置模块进行搜索; exp:os、sys模块
2.#环境变量的路径; exp:pip install 安装的包
3.#入口文件所在的目录;exp:我们直接使用python xxx.py的文件即为入口文件
入口文件
值得一说的是我们的入口文件,因为像内置和环境变量在导入过程中大家都比较熟悉,
一般情况下,我们直接使用python运行的文件就是我们的入口文件,一般使用main方法进行标识
#使用内置__name__方法进行获取文件是否为入口
if __name__ == '__main__':
main()
入口文件一般具有一个特点就是目录层级为顶层的,不低于任何模块或者包,这样是为了在运行时,sys.path检测到的目录为最顶层,防止出现导入过程中无法找到包的问题。
常见目录结构如下:
#其中run.py作为入口文件
├── package
│ ├──__init__.py
│ ├── sub_1
│ │ ├── __init__.py
│ │ ├── module1.py
│ │ └── module2.py
│ └── sub_2
│ ├── __init__.py
│ └── module3.py
└── run.py
绝对导入和相对导入
在python中绝对导入和相对导入都有一个参考值,其中绝对导入是参考的项目根目录,我们的相对导入参考的是运行模块所在的目录
绝对导入
让我们从一个报错开始我们的绝对导入的讲解吧,我们知道使用绝对导入参考是根目录,创建如下对应的目录使用,cmd窗口运行
使用cmd运行提示No module named “test3”,我们查看机制可以发现我们遵循的是test1.py这个入口文件所在的目录进行导入,从上图可以看出test1文件属于package,在package中并不存在test3.py;
实例证明:
#test1.py
import sys
print (sys.path)
#############输出结果#############
['C:\\Users\\x-149\\Desktop\\hahaha\\packge',
'C:\\Users\\x-149\\AppData\\Python\\Python38\\lib\\site-packages']
从结果可以看出上述的说明我们在使用绝对路径时一定要把项目的根目录加入在我们的path路径中,防止出现一些未知的问题
相对导入
相对导入指的是相对当前路径进行导入
同级(package)进行导入报错no know parent package,可见这种写法是bad正确的相对导入应该是
相对于当前运行的目录的一个运行当然,如果我们想导入test2.py文件使用
也会报错no know parent package
小结:使用相对导入是相对入口文件(顶级模块)所在目录下的子模块以及子包的导入
解决import报错问题
手动给\Lib\site-packages文件夹中建立一个.pth文件,内容为自己写的库绝对路径,这样就相当于添加了根目录
小结
from import如果采用相对导入会出现各种导入出现异常问题,所以我们在库的导入过程中一般采用绝对路径的导入方式,简单直接方便,如果有些目录导入比较麻烦,可以将目录添加至根目录方便索引位置