一. 模块的导入
已经写好的一组函数 变量 方法 放在一个文件里 (这个文件可以被我们直接使用)这个文件就是个模块
模块有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
原文:https://www.cnblogs.com/NachoLau/p/9526919.html