1、模块循环导入问题:

模块循环/嵌套导入抛出异常的根本原因是由于在python中模块被导入一次之后,就不会重新导入,只会在第一次导入时执行模块内代码

在我们的项目中应该尽量避免出现循环/嵌套导入,如果出现多个模块都需要共享的数据,可以将共享的数据集中存放到某一个地方

在程序出现了循环/嵌套导入后的异常分析、解决方法如下:

#错误示范文件内容如下
#m1.py
print('正在导入m1')
from m2 import y
 
x='m1'
#m2.py
print('正在导入m2')
from m1 import x
 
y='m2'
#run.py
import m1

 

 

方法一:导入语句放到最后

#m1.py
print('正在导入m1')
x='m1'
 
from m2 import y
 
#m2.py
print('正在导入m2')
y='m2'
 
from m1 import x

 

 

方法二:导入语句放到函数中

#m1.py
print('正在导入m1')
def f1():
    from m2 import y
    print(x,y)
 
x = 'm1'
 
#m2.py
print('正在导入m2')
def f2():
    from m1 import x
    print(x,y)
 
y = 'm2'
 
#run.py
import m1
 
m1.f1()

 

方法一中的名称空间关系图:

python span嵌套读取text_python

 

方法二中的名称空间关系图:

 

python span嵌套读取text_python_02

 

 

2、模块的搜索路径

 

2.1、模块的查找顺序是:

python span嵌套读取text_python_03

 

 

 

 

 

2.2、导入模块的路径:

 

绝对导入: 以执行文件的sys.path为起始点开始导入,称之为绝对导入

        优点: 执行文件与被导入的模块中都可以使用

        缺点: 所有导入都是以sys.path为起始点,导入麻烦

相对导入: 参照当前所在文件的文件夹为起始开始查找,称之为相对导入

        符号: .代表当前所在文件的文件加;

..代表上一级文件夹;

...代上一级的上一级文件夹

        优点: 导入更加简单

        缺点: 只能在导入包中的模块时才能使用,不能在执行文件中用

 

3、区分python文件的两种用途:

  • 编写好的一个python文件可以有两种用途:    

u 一:脚本,一个文件就是整个程序,用来被执行

u 二:模块,文件中存放着一堆功能,用来被导入使用

 

  • python为我们内置了全局变量__name__,

u 当文件被当做脚本执行时:__name__ 等于'__main__'

u 当文件被当做模块导入时:__name__等于模块名

 

  • 作用:用来控制.py文件在不同的应用场景下执行不同的逻辑

u if __name__ == '__main__'

4、软件开发目录

 

  • confàsettings.py
  • core(主要逻辑)àsrc.py
  • dbàdb.txt
  • lib(库)àcommon.py
  • bin(入口,启动)àstart.py
  • logàaccess.log
  • readme(说明书)