今日内容:
1.循环导入问题
2.py文件两种用途
3.模块的搜索路径优先级
4.软件开发的目录规范
一、循环导入问题:
# m1.py
print("导入m1")
from m2 import y
x = 1
# m2.py
print("导入m2")
from m1 import x
y = 2
# run.py
import m1
该程序会直接报错,因为我们在导入m1时,还没运行到x=1,就导入了m2,此时m2需要引用x,而x还没有定义。反之对y也是如此,m1要引用m2的y,此时m2还没来得及定义y
'''
解决方法1:将导入模块语句放在定义变量后,缺点是使得程序的可读性变差,因为我们导入模块一般都在开头
'''
#m1.py
print('正在导入m1')
x='1'
from m2 import y
#m2.py
print('正在导入m2')
y='2'
from m1 import x
'''
推荐方法
解决方法2:将导入模块的代码写到函数中,在调用时,才去加载模块
'''
#m1.py
print('正在导入m1')
def f1():
from m2 import y
print(x,y)
x = '1'
# f1()
#m2.py
print('正在导入m2')
def f2():
from m1 import x
print(x,y)
y = '2'
#run.py
import m1
m1.f1()
'''
二、py文件的两种用途
在一个py文件中,可以使用__name__的方法查看自己的属性
1.当文件被当成脚本直接运行的时候,__name__的值为__main__
2.当文件被当成模块导入时候,__name__的值为模块名称,如导入spam.py文件,__name__ = 'spam'
三、模块搜索路径与查找优先级:
1.先从内存中已经导入的模块里找
2.然后再查找内置的模块
3.最后去sys.path列表中存放的多个文件夹里依次检索
利用sys模块下的sys.path可以获取一个列表,这个列表就是存放python查找导入模块文件夹的列表
(1) 先从内存中已经导入的模块里找
import mmm
mmm.f1()
import time
time.sleep(15)
print('='*50)
import mmm
mmm.f1()
(2) 然后再查找内置的模块
'''
sys.modules是一个全局字典,该字典是python启动后就加载在内存中。每当程序员
导入新的模块,sys.modules都将记录这些模块。字典sys.modules对于加载模块起到
了缓冲的作用。当某个模块第一次导入,字典sys.modules将自动记录该模块。当第
二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度。
'''
import sys
print(sys.modules)
import sys
print(sys.path)
当前执行文件所在的文件夹
import logging
print(logging)
(3) 最后去sys.path列表中存放的多个文件夹里依次检索
'''
当我们有第三方模块或者自定义模块需要导入时,有下面两种方法
'''
示例1:
import sys
print(sys.path)
sys.path.append(r'D:\python全栈15期\aaa\bbb')
import ccc
ccc.f1()
示例2:
import sys
print(sys.path)
import aaa.bbb.ccc as c
c.f1()
from aaa.bbb import ccc
ccc.f1()
四、软件开发的目录规范
一般要有一个启动程序,如start.py,其中尽量不包含逻辑代码,只用来启动程序
对于一个简单的项目,还需要包含
1.存放核心代码的文件
2.存放公用功能的模块
3.配置文件
4.日志文件
image.png
将启动文件直接放到程序目录下,会使我们程序运行时,sys.path将主程序的文件路径加载进去,方便其他文件导入模版