# 模块分三种
# 自定义模块
# 内置模块 time re sys os
# 第三方模块/扩展模块
# 自定义模块 *****
# 模块的创建 导入 模块名
# import
# 模块的命名空间
# 在导入模块的时候发生了什么?
# 那么这个模块的名字能够找到这个模块所在的内存空间,任意使用里面的名字
# 为模块起别名 as
# 导入多个模块
# from import
# 模块的命名空间
# 在导入模块的时候发生了什么?
# 只导入模块中的某一个名字,其他没有导入的不能直接使用
# 为模块起别名 as
# 导入多个名字
# 可以 from 模块 import 名字1,名字2
# 也可以 from 模块 import * 一般情况下不用
# *和__all__
# 模块的循环引用 - 一定会报错
# 模块的加载与修改(了解)
# import importlib
# importlib.reload(模块名)
# 把模块当做脚本来执行(*****)
# if __name__ == '__main__'下面的代码只有在直接执行这个文件的时候才被执行
# 模块搜索路径
# sys.path
# 第一个元素 是你当前执行的py文件所在的目录
# 所以同目录下的py文件的导入都不会报错
# 如果要导入的文件不是同目录下的,需要自己修改sys.path目录
# 包 ***
# 导入模块 常用的
# import
# from import
# 导入包
# __init__文件 在导入包的时候执行这个包下的__init__方法
# 绝对导入,永远要注意路径的问题
# 相对导入,永远不要直接执行使用了相对导入的文件
# __all__和* 也不是完美的,但是可以简化你的操作
# 注意 模块名 需要符合变量命名规范
# 导入模块的时候,pycharm的报错提示是不可靠的
# 导入一个模块 就是import 文件名 不带.py
import my_module # 导入模块
# 1.模块导入的过程到底做了哪些事?
# 相当于执行了这个被导入的py文件
# 这个模块不会被重复导入
# import sys
# print(sys.modules)
# 内存中所有被导入的模块都会存储在sys.modules字典中
# 这个字典的key是这个模块的名字,value是这个模块的内存地址
# import my_module
# print(sys.modules['my_module'])
# print(my_module)
# 模块导入之后 可以直接使用这个模块中的函数 和 变量
# print(my_module.flag)
# my_module.read1()
# my_module.read2()
#
# def read2():
# print('in my read2')
# flag = False
# my_module.read2()
# 模块的命名空间
# 每一个模块的导入都会创建一个属于自己的命名空间
# 在导入模块的时候发生了什么?
# 1.创建一个属于这个模块的命名空间
# 2.执行这个模块中的代码
# 3.创建一个引用来调用这个模块命名空间中的名字
# 4.把导入的模块和内存地址存到sys.modules中
# import my_module as m
# 可以给导入的模块进行重命名,重命名之后新的名字会出现在内存空间中来作为模块的引用
# 但是原模块名就不能在文件中使用了
# import configparser as conf
# m.read2()
# 序列化
# json pickle
# 你提供序列化功能,帮助用户对***进行序列化
# def dump(somthing,m = 'json'):
# if m == 'json':import json as m
# else:import pickle as m
# m.dumps(somthing)
# 数据库
# oracle oracle_db
# mysql mysql_db
# if db_name == 'mysql':# import mysql_db as db
# elif db_name == 'oracle': import oracle_db as db
# db.connect()
# db.exec()
# 导入多个模块
# 1.都写在文件的开始
# 2.顺序: 先导入内置的,再导入扩展的,最后导入自定义的
import os
import sys
import flask # 扩展的web框架
import requests # 请求url
import my_module
# 3.导入多个模块
# import os as o,sys as s,flask as f
# os.remove()
# sys.path
# import my_module
# 导入这个模块 相当于执行一个模块
# 导入模块 模块名作为这个模块命名空间的一个引用
# 可以使用模块名 随意的使用这个命名空间中的名字
# from my_module import flag
# from import 仍然会在导入模块的时候执行整个模块
# 仍然会把模块中所有的名字存在一个属于这个模块的命名空间中
# 区别在于 使用模块中名字的时候不需要再带着模块名
# 而是 导入了 什么名字 就能用什么名字
# 没有导入的名字不能使用
# flag = False
# print(flag)
# read2()
# my_module.read1()
# 都会完整的执行这个my_module文件
# 没被导入的其他名字就不能用了
# 导入多个名字和重命名语法
# from my_module import flag as f,read1 as r1
# from my_module import read2
# read2()
# print(f)
# from my_module import * #==>from my_module import flag,read1,read2
# print(flag)
# read1()
# 如果你导入一个模块 这个模块中假设有20个方法
# 你只用一个 from 模块 import 这个方法
# 你用10个 import 模块
# from import *
# def time():
# print('time.time')
# from my_module import *
# time()
from my_module import read2
read2()
# __all__只和*相关
# 如果不定义__all__,默认*可以导入这个模块中的所有名字
# 如果定义了__all__,那么只有出现在all这个列表中的名字可以被*导入
import time
import importlib
import my_module
print(my_module.flag)
time.sleep(20)
importlib.reload(my_module) # 测试
print(my_module.flag)
from my_module import login
# __name__是py文件中的一个内置的变量
# 当你直接执行这个py文件的时候,这个文件中的__name__就是'__main__'
# 当你以模块的形式导入这个py文件的时候,这个文件中的__name__就是模块名的字符串
# __file__
if __name__ == '__main__':
# 写在这段代码下面的所有内容只有在当前py文件被直接run的时候才会执行
# 被导入的时候不会被执行
pass
# main # table会自动补全
# 脚本 : 就是一个被直接执行run的文件
模块搜索路径
# import sys
# print(sys.path)
# 导入模块的时候,从这个列表中的目录下去找
# sys.path.append(r'E:sylarpython_workspaceday31homework')
# import core
# core.login()
包
# 要使用get方法 得先导入policy
# import glance.api.policy #只能也必须精确到模块
# glance.api.policy.get()
# import glance.api.policy as policy #只能也必须精确到模块
# policy.get()
# from glance.api import policy
# policy.get()
# 如果导入的是一个包的名字而不是一个py文件的名字
# 就会直接执行这个包下面的__init__.py
# 除此之外什么也不会做
import sys
# print(sys.path)
# import glance # -->init-->import api
# glance.api.policy.get()
import glance
# 使用相对导入,不能直接执行使用了相对导入的文件
# 必须将这个存在着相对导入的包作为一个整体来使用
# 只有你写了一个包
# 这个包对外提供功能,而不是用来直接执行这个包中的某个py文件的时候才会用到相对导入