模块与包 项目结构
#模块和包
#import
#在import的过程发生了那些事情
#import 一个模块相当执行了这个模块
# 一个模块不能被重复导入
#模块和文件之间的内存空间是隔离的
#模块的名字必须要符合变量命名规范
#1.寻找模块
#2.如果找到了,就开辟一个空间,执行这个模块
#3.把这个模块中用到的名字都收录到新开辟的空间中
#4.创建一个变量来引用这个模块的空间
#被导入的模块和本文件之间命名空间的关系
#import 多个模块
#注意:
#import os
#import time
#遵循顺序 内置 第三方 自定义
#pep8规范
#给导入的模块起别名
#格式 import 模块 as 别名
#注意 有了别名之后,就不能直接用模块.属性而需要用别名.属性
#模块搜索路径
#正常的sys.path 中 不包括内置和第三方模块
# import sys
# print(sys.path) #只看列表中的第一个就是当前文件的路径
#一个模块是否被导入就看这个模块所在的目录在不在这个sys.modules 中
# import sys
# import my_module #自定义的一个模块
# print(sys.modules) #字典中含有my_module 的路径
#模块和脚本
#俩种运行一个py文件的方法
#1直接运行 或者 在cmd 中运行 和在pycharm 中run执行,都是脚本
#2被import导入的 就是模块
#模块 from 模块 import 属性
#例 from my_module import name
# print(name)
#2 不推荐使用 了解
#from my_module inport * #*号表示模块中的所有属性。
# print(name) #可以直接使用模块中的属性
# read()
#在from import的过程发生的事
#1 要找到 这个模块
#开空间,执行这个模块文件
#将所以模块文件的属性都存储在模块所属空间中
#建立一个引用属性,
#补充内容:
#1.pyc文件,pyi文件
#pyc 只能提高程序的启动效率并不能提高程序的执行效率
#2.模块的导入和修改
#导入之后,运行属性,然后再改模块中的属性,再运行属性,属性不会变
# import time
# import my_module #导入模块
# print(my_module.name) #alex
# time.sleep(10) #暂停十秒,修改模块中属性
# import my_module
# print(my_module.name) #alex #不变
#如果要修改的话 导入一个新的模块 from importlib import reload
# from importlib import reload
# import time
# import my_module #导入模块
# print(my_module.name) #alex
# time.sleep(10) #暂停十秒,修改模块中属性
# reload(my_module)
# print(my_module.name) #tiantian #属性以变
#3.模块的循环引用
#不能循环
#4.dir(模块名)
#可以获取这个模块的名字
#包
#什么是包 package
#含有一个__init__.py的文件夹就是一个包
#包含中通常含有一些py文件
# #从包导入模块 ****
# import glance2.api.policy as policy #as 别名
# policy.get()
#导入包
#绝对导入
#导入包的过程中的发生了什么事
#相当于执行了包中的__init__.py文件
#sys.path 中的内容,永远是当前你执行的文件
#相对导入 运用了相对导入的文件不能被直接执行
# '.'表示当前目录
# '..'表示上一级目录
项目结构
bin 包中start.py中模板
import os import sys base_path =os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #动态绝对路径
#os.path.abspath(__file__) 绝对路径 os.path.dirname() conf文件那一层 再来一层就是项目soft那一层 参照上图
sys.path.append(base_path) from core import core if __name__ == '__main__': core.main()