一、模块的循环导入问题
run.py
# import m1 # 第一次导入
m1.py
# 错误示范
'''
print('正在导入m1')
from m2 import y #第一次导入m2
x='m1'
'''
m2.py
# 错误示范
'''
print('正在导入m2')
from m1 import x y='m2'
'''
解决方案:
一:把循环导入的语句放到名字定义的后面
# m1.py
# y='m2'
# from m1 import x
# m2.py
# print('正在导入m2')
#
# y='m2'
# from m1 import x
二:将循环导入的语句放到函数内
# m1.py
print('正在导入m1') def f1():
from m2 import y,f2 #第一次导入m2
print('m1.f1---->y: ',y)
f2()
x='m1'
# m2.py
def f2():
from m1 import x
print('m2.f2--->x: ',x) y='m2'
二、区分python文件的两种用途
当文件被执行时__name__=='__main__'
当文件被导入时__name__=='模块名'
if __name__ == '__main__':
f1()
f2()
三、模块的搜索路径
模块搜索路径的优先级:1.内存中已经加载过的,2.内置模块,3.sys.path第一个值是当前执行文件所在的文件夹
环境变量是以当前执行文件为准的.
注: 所有被导入的模块参照环境变量sys.path都是以执行文件为准的.被导入的模块再去导入其它模块,也是参照sys.path
四、绝对导入与相对导入
绝对导入:以执行文件的sys.path为起始位置开始导入,称之为绝对导入
优点:执行文件与被导入的模块中都可以用
缺点:所有导入都是以sys.path为起始点,导入麻烦
相对导入:
符号:一个"."代表当前所在文件夹,".."代表上一级文件夹,"..."代表上一级的上一级文件夹
优点:导入更加简单
缺点:只能在导入包中的模块时才能使用,不能在执行文件中使用
注意: 执行文件中只能用绝对导入
五、软件开发的目录规范
规范化的目录结构能更好的控制程序,让程序具有更高的可读性
1.可读性高 2.可维护性高
通常一个项目都会有的目录如下:
项目名/
| -- bin/ #程序启动脚本/程序入口
| | -- start.py
|
| -- conf/ #配置文件
| | --settings.py
| -- core/ #业务逻辑
| | --src.py
| -- db/
| | --数据库文件
| -- lib/ #第三方库
| | --common.py
| -- log/ #日志
| | --transaction.log
README #说明文档
目录后继会继续补充!