模块的循环导入问题
#m1.py print('我是m1') from m2 import y x='m1' #m2.py print('我是m2') from m1 import x y-'m2' #run.py import m1
先执行run.py--->执行import m1,开始导入m1并运行其内部代码--->打印内容"正在导入m1"
--->执行from m2 import y 开始导入m2并运行其内部代码--->打印内容“正在导入m2”--->执行from m1 import x,由于m1已经被导入过了,所以不会重新导入,所以直接去m1中拿x,然而x此时并没有存在于m1中,所以报错
解决方案一:将循环导入代码写到最后
#m1.py print('正在导入m1') x='m1' from m2 import y #m2.py print('正在导入m2') y='m2' from m1 import x #run.py import m1
解决方案二:将循环代码写到函数中
#m1.py print('正在导入m1') def f1(): from m2 import y print('m1',m1) x='m1' #m2.py print('正在导入m2') def f2(): from m1 import x print('m2',m2) y='m2' #run.py import m1
区分文件的两种用途
def f1(): print('f1') def f2(): print('f2') 当文件被执行时__name__=='__main__' 当文件被导入时__name__=='模块名' print(__name__) if __name__ == '__main__': f1() f2()
模块的搜索路径的优先级
1.内存中已经加载过的
2.内置模块
3.sys.path sys路径的第一个值是当前执行文件所在文件夹
绝对导入和相对导入
绝对导入:以执行文件的sys.path为起始点开始导入,称之为绝对导入
优点:执行文件与被导入模块都能使用
缺点:所有导入都是以sys.path为起始点,导入麻烦
相对导入:参照当前文件所在文件夹为起始开始查找
符号:.代表当前文件的文件夹。..代表上一级文件夹
优点:导入更简单
缺点:只能在被导入模块中使用,不能在执行文件中用
软件开发的目录规范
ATM
|
————bin(程序主入口,执行文件)
|
——————conf(配置文件,全面变量)
|
—————core(核心逻辑,业务代码)
|
——————lib(自定义模块)
|
——————db(用户信息)
|
——————log(日志文件)