day 29(模块和包)
阅读目录
- 一 模块
- 3.1 import
- 3.2 from ... import...
- 3.3 把模块当做脚本执行
- 3.4 模块搜索路径
- 3.5 编译python文件
- 二 包
- 2.2 import
- 2.3 from ... import ...
- 2.4 __init__.py文件
- 2.5 from glance.api import *
- 2.6 绝对导入和相对导入
- 2.7 单独导入包
一。模块和脚本
模块:
定义:如果一个py文件被导入了,他就是一个模块
脚本:
定义:如果一个py文件被直接执行了,那他就是一个脚本
模块:
1.没有具体的调用过程
2.但是能对外提供功能
当一个模块被导入时,如果pyc文件不存在,python解释器就回去创建,存在不会再次被创建
pyc编译文件: 文件 -字节码-机器码
编译的具体过程:
1.从上到下编译成字节码pyc
2.从上到下,解释执行代码
为什么要编译
# 1.一个文件如果作为模块 一定会经常被导入
# 2.每次被导入都要经历一个被编译的过程
# 3.包.编译耗费时间
# 4.所以模块在被第一次导入的时候被编译存在pyc文件里
# 5.之后的导入可以直接呐pyc文件中的字节码,就可以直接执行了
# 编译文件 在模块导入的一瞬间 能够提高代码的执行速度
# 不能提高程序在具体执行的时候的效率
引入模块必须满足两个条件:
1.模块名必须满足变量名的命名规范
2.被导入的模块所在的位置必须在sys.path所在的搜索路径中
当login模块被当做脚本执行的时候,能够独立完成登陆功能
# 当login模块被当做模块导入的时候,需要等待调用才能完成功能
# 当一个模块被当做脚本执行的时候,__name__是一个字符串数据类型的'__main__'
# 当一个模块被当做模块导入的时候,__name__是一个字符串数据类型模块名
if __name__ == '__main__':
log_in()
# print('__name__ : ',repr(__name__))
# if __name__ == '__main__':
# 控制了
# 只要当前这个文件直接被执行 就会执行if条件语句内的代码
# 否则 就不会执行if条件语句内的代码
模块是对外提供功能的
# 如果 我写的这个模块 足够大 能提供的功能足够多
# 多到一个文件写不下
# 把对外提供的功能 根据提供的内容不同,分成几个文件
# 把这些文件放在一个文件夹下,就形成了包
# django框架 包
# 操作数据库的 模块
# 和web页面交互的 模块
# 登录认证 模块
# 安全的中间件 模块
# 导入具体的文件
# from glance.api import policy
# policy.get()
#
# import glance.api.policy as policy
# # glance.api.policy.get()
# policy.get()
# 直接导入包
import sys
print(sys.path)
# import glance
# 使用绝对路径
# 导入一个包 相当于 执行了这个包下面的 __init__.py
# glance #对象
# glance.api.policy.get()
# glance.cmd.manage.main()
# sys.path
from new_pac import glance
# 绝对路径
# 被直接执行的文件与包的关系必须是固定的,
# 一旦发生改变,包内的所有关系都要重新指定
# 跨包引用
# import sys
# print(sys.path)
# 在一个py文件中使用了相对路径引入一个模块
# 那么这个文件就不能被当成脚本运行了
# 包就是py模块的集合
# 自带__init__.py文件
# py2 包中必须有一个__init__.py文件
# py3
# 能不能导入一个包:要看sys.path中的路径下有没有这个包
# 从包中导入模块: 把包与包之间的关系写清楚,精确到模块,就一定能导入
# 直接导入一个包,并不会导入包下的模块,而是执行这个包下的__init__.py文件
# 如果对导入还有更高的要求
# 可以对包中的__init__.py文件做定义
# 绝对路径导入的方式
# 相对路径导入的方式 使用相对路径导入的模块不能作为脚本执行
from new_pec2 import glance