模块的循环导入问题

    

#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(日志文件)