模块的绝对导入、相对导入
系统导入模块的路径(绝对导入)
-
内存中:如果之前成功导入过某个模块,直接使用已经存在的模块
-
如果内存中没有则使用内置中模块(安装路径下Lib文件中)
-
如果以上两个地方都没有找到则去sys.path中寻找(sys这是用c写的一个模块,且不允许查看源码) sys.path是一个路径列表,在运行的时候可以动态添加路径如果这三个都找不到则会报错,这样就需要我们在sys.path里面添加一个动态路径(最好不要放在Lib目录下,因为有可能会污染解释器路径)
-
查看sys.path路径里面的内容
import sys print(sys.path) 得: ['E:\\xiaoxiannv', 'E:\\xiaoxiannv', 'E:\\bao\\PyCharm2020.1.3\\plugins\\python\\helpers\\pycharm_display', 'C:\\Python\\Python36\\python36.zip', 'C:\\Python\\Python36\\DLLs', 'C:\\Python\\Python36\\lib', 'C:\\Python\\Python36', 'C:\\Users\\baobao\\AppData\\Roaming\\Python\\Python36\\site-packages', 'C:\\Python\\Python36\\lib\\site-packages', 'E:\\bao\\PyCharm2020.1.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend']
-
__file__
用来查看当前文件的绝对路径 -
给不在同一目录下的模块添加一个新的路径(在sys.path中动态添加模块路径)
- os.path.dirname()获取某个路径的父路径,通常用于获取当前模块的相对路径
import sys #用来获取添加模块的路径 import os #用啦获取模块的父路径 sys.path.append(os.path.dirname(__file__)+'/aa') import pyth #此处的pyth必须写在 import sys 、import os 的下边否则找不到路径,还有pyth爆红不是出错 print(pyth.a)
-
导入模块的多种方式
- import xxx 导入模块的所有成员
- import aaa,bbb 一次性导入多个模块的成员(不建议使用)
- from xxx import a 从某个模块中导入指定的成员
- from xxx import a,b 从某个模块中导入多个指定的成员
- from xxx import * 从某个模块中导入所有成员
import a 和from xxx import * 的区别
-
import a在使用模块中成员的时候必须加上模块名称
import pyth print(pyth.a)
-
from xxx import * 可以直接调用 此方法容易产生命名冲突(如果产生冲突·,后定义的成员生效(覆盖))
from pyth import a print(a)
-
解决名称冲突问题
-
改用import xxx方式
-
自己避免使用同名
-
使用别名解决冲突****
-
alias(as的缩写)
- 给成员起别名避免名称冲突
from ss import s as d s=10 print(s) print(d) 得: 10 5
- 给模块起别名,目的简化书写
import ss as d print(d.s)
-
-
-
from xxx import *控制成员被导入
-
默认情况下所有成员都会被导入
-
__all__
是一个列表,列表内写的是成员名称(字符串形式)本模块可以被外界使用的成员-
注意:
__all__
只是对from xxx import * 这种导入方式生效,其余方式都不生效自定义模块
-
运行模块,在此模块运行上面自定义模块时自定义使用了__all__
,且里面只添加了s和a所以运行模块时 只能打印是s和a打印不出来c,
相对导入
注意:
- 相对路径不能在执行文件中使用
- 相对导入只能在被导入的模块中使用,使用相对导入,就不需要考虑执行文件是谁了,只需要模块之间路径的关系
- 顶层包之间不能相互访问(顶层包就是与执行文件处于同一目录下的包(在sys.path中添加路径除外))
-
mokuai就相当于是一个项目(相对导入就是,针对某个项目中的不同模块之间进行导入,称为相对导入)
-
xiangdui是顶层执行模块
-
相对路径只有一种格式:from 相对路径 import xxx
- 相对路径中的.号
- . 表示当前的路径
- ..表示的是父路径
- ...表示父路径的父路径
- 相对路径中的.号
-
不使用相对导入的方式导入本项目的模块(直接找到父路径的父路径,然后加上要导入的文件名称)