模块和包
一. 模块的导入
已经写好的一组函数 变量 方法 放在一个文件里 (这个文件可以被我们直接使用)这个文件就是个模块
模块有py dll文件 zip文件
自己写一个模块 创建一个py文件,给它起一个 符合变量名命名规则的名字,这个名字就是模块名
导入一个模块就是执行一个模块
import的命名空间,模块和当前文件在不同的命名空间中
模块被重复导入时 会直接略过 不会再执行一次
使用my_module模块中的名字 print(my_module.name) print(my_module.read1) my_module.read1() 判断模块是否已导入 import sys print(sys.modules) 给模块起别名,起了别名之后,使用这个模块就都使用别名引用变量了 这样模块名较长时 可以降低长度 再执行my_module就无效了 import my_module as m m.read1() 还可以这样用 json pickle dumps loads def func(dic,t = 'json'): if t == 'json': import json return json.dumps(dic) elif t == 'pickle': import pickle return pickle.dumps(dic) def func(dic, t='json'): if t == 'json': import json as aaa elif t == 'pickle': import pickle as aaa return aaa.dumps(dic) 导入多个模块 import os,time import os as o,time as t 在模块中的变量名如果在外部的脚本文件中出现了, 并在脚本文件中定义了, 是不会改变这个模块内部引用这个变量名的 * 和 __all__, __all__能够约束*导入的变量的内容 在__init__中第一行写 __all__ = ['name','read1','read2'], 在import * 时, 会导入列表中的变量 from my_module import * print(name) read1() read2() 在脚本执行时, 已经import的模块会写进内存, 在运行中修改模块文件不会产生效果, 如果要执行修改的模块, 可以用reload这个函数 import importlib importlib.reload(my_module) 执行一个py文件的方式: 在cmd执行,在python执行 : 直接执行这个文件 - 以脚本的形式运行这个文件 导入这个文件 都是py文件 直接运行这个文件 这个文件就是一个脚本 导入这个文件 这个文件就是一个模块 当一个py文件 当做一个脚本的时候 : 能够独立的提供一个功能,能自主完成交互 当成一个模块的时候 : 能够被导入这调用这个功能,不能自主交互 一个文件中的__name__变量 当这个文件被当做脚本执行的时候 __name__ == '__main__' 当这个文件被当做模块导入的时候 __name__ == '模块的名字' 可以在模块的文件中输入main, 同时按tab键 if __name__ == '__main__': print(func()) import的路径添加 import sys import my_module # 不在路径里 print(sys.path) path = r'D:\python\模块和包' sys.path.append(path)
二. 包
包是几个模块的集合, 文件夹中有一个__init__.py文件
从包中导入模块 1.import import glance.api.policy glance.api.policy.get() import glance.api.policy as policy policy.get() 2.from import from glance.api import policy policy.get() from glance.api.policy import get get() 直接导入包 ,需要通过设计init文件,来完成导入包之后的操作 导入一个包 相当于执行了这个包下面的__init__.py文件 导入一个包后, 如果__init__文件是空的, 包下面的文件夹和py文件都不会加载 绝对导入 : 在执行一个py脚本的时候,这个脚本以及和这个脚本同级的模块中只能用绝对导入, 相对导入需要把init放在和这个脚本同级的一个包的下面 在api下面的__init__.py不能写import policy, 因为在调用api这个包的时候是在glance下执行的 在直接调用时, 要在每个包的__init__.py里写上from glance import api, 在api下的包需要写from glance.api import policy 这样在导入这个报的时候, 就相当于直接加载了这个包的所有的py文件 缺点 所有的导入都要从一个根目录下往后解释文件夹之间的关系 如果当前导入包的文件和被导入的包的位置关系发生了变化,那么所有的init文件都要做相应的调整 from glance.api.policy import get() # 只导入policy模块的get()函数 get() from glance.api import policy # 只导入policy包 policy import glance # 在glance的init文件写好了的情况下, 导入glance一个包可以直接导入这个包的全部模块 glance下的init要这么写from glance import api glance下的api包下的init要这么写from glance.api import policy 相对导入 : 不需要去反复的修改路径 只要一个包中的所有文件夹和文件的相对位置不发生改变 不需要去关心当前这个包和被执行的文件之间的层级关系 缺点 含有相对导入的py文件不能被直接执行 必须放在包中被导入的调用才能正常的使用 如果要导入一个模块, 这个模块和现在执行的脚本在同一个目录下, 这个模块也不能用from . import xxx import glance glance.api.policy.get() from binance import glance2 # glance是binance下的一个包 glance2.api.policy.get() glance下的init文件要这么写from . import api