(1)、标准模块,无需安装和编写,自动导入就有的模块,比如说random,math
(2)、第三方模块,别人写到的发布到平台上的模块,需要安装的模块,比如,requests,需要pip安装的
(3)、自定义模块,自己写的模块
Python包实际上是一个目录,包含python的目录
包结构的目录里有一个_int_.py的模块。这是一个初始化文件,一般导入当前包里的内容,都会执行__init__.py文件,用于初始化数据库连接
py2,_int_.py是必须的;py3,_int_.py是可选的,例如:
这里,py2只会识别pack02是一个包,而py3会识别pack01和pack02为包
若是有一样的模块名了,且不能够修改,我们可以使用别名来区分并且调用这些模块
导入标准库和导入自定义库是有一些区别的
import string
print(string.ascii_uppercase)
# 执行结果:ABCDEFGHIJKLMNOPQRSTUVWXYZ
# 从string里单独导入具体的遍变量或者函数,导入之后可以不用"string."调用这个函数或者类
from string import ascii_uppercase
print(ascii_uppercase)
# 执行结果:ABCDEFGHIJKLMNOPQRSTUVWXYZ
导入所有函数(模糊导入)
from string import *
print(ascii_lowercase)
# 执行结果:abcdefghijklmnopqrstuvwxyz
目录结构展示:
包展示:
# pack01/one.py
print("this is pack01 one")
def packtest():
print("pack01 test func")
# pack02/one.py
print("this is pack02 one")
def packtest():
print("pack02 test func")
# two.py
print("i am subpk01 two model")
# three.py
print("i am subpk02 three model")
分割线
# 这个代码是在mod.py这个主程序或者说程序入口执行的(top_level)
import pack01 # × 这个只是导入了包
pack01.one.packtest() # 执行之后会报错
[错误做法]
导入自定义模块时,光导入包是无法识别的,必须要导入到模块这层才能够被识别。
[正确做法]
# 当这样导入的时候,这种导入叫做直接导入
# 就是直接运行了E:\python\Python\python.exe F:/Desktop/Pycharm练习/模块与包/模块导入/mod.py
from pack01 import one
# 执行结果:this is pack01 one
# 另外,这是虽然只导入了one,但是其实整个pack01都运行了
模块运行方式有两种方式:直接解释器运行(直接运行的为主程序/程序入口)和导入运行(只要导入了模块(无论整体或者部分),那么这个整个模块都会运行)
第一次导入的时候,就会将这个模块加载到内存空间,下次导入的时候,会先查看内存空间有没有
# 从pack01包中导入了one这个模块
from pack01 import one
from pack01 import one
# 执行结果
this is pack01 one
# 如果导入的模块明相同,就使用后导入的模块
from pack01.one import packtest
from pack02.one import packtest
packtest()
# 执行结果:
this is pack01 one
this is pack02 one
pack02 test func
解决办法:给模块取别名---as
# 从pack02.one模块中导入packtest函数,取别名叫做pk02
from pack02.one import packtest as pk02
pk02()
# 执行结果
pack02 test func
接受字符串,动态导入。需要使用"importlib"模块
import importlib
st = importlib.import_module('string')
print(st.digits)
# 执行结果:
0123456789
[动态导入脚本]
# 要求:接受用户从键盘的输入,按q退出,用户输入什么模块就导入什么模块,并提示导入成功
import importlib
while True:
try: # 执行要尝试(try)的代码
module_name = input("请输入你要导入的模块:")
if module_name.lower() == "q":
print("模块导入结束")
break
st = importlib.import_module(module_name)
print("导入成功!")
except: # 执行应对异常发生时的代码
print("\033[31m没有这个模块!\033[0m")
[执行结果查看]
以". "开头的导入路径称为相对导入
. 表示当前
.. 表示上一级
... 表示上上级
相对导入不能访问到top-level那一层,只能访问到top-level以下层
在top-level以下层推荐使用相对导入,否则程序入口改变绝对路径就会改变
绝对导入路径 就是从top-level那一层开始,一层一层往下数
简单来说,若是以mod.py作为程序入口,那么它和它平级的pack01和pack02都是top-level