python模块导入问题浅析

一:import搜索模块路径

1):使用sys.path查看当前程序的模块搜索路径,返回一个列表

2):使用sys.path.append(‘模块路径’)添加自定义模块

      例如:添加桌面上的demo.py模块     

     

3):通过修改环境变量添加自定义模块

4):通过创建.pth文件添加自定义模块(推荐此方法添加自定义模块路径)

二:import和from A import B 执行过程浅析

1:import A

      1):判断A模块是否已经被导入到sys.modules中了,(sys.modules中保存的是已经被导入过的模块),如果已经被导入了就不再导入,而是直接使用模块对象

      2):如果没有找到,python解释器就去sys.path中去搜索,如果没有找到,则抛出异常。

      3):根据模块文件A.py创建一个模块对象(和模块名一样)

      4):把模块对象的名字添加到本地作用域中(使用locals查看本地作用域的所有名字)

      Reload:重新加载模块,对模块对象添加新属性(将新的属性添加到原有对象)

2:from A import B

            1): 判断A模块是否已经被导入过了 <sys.modules中保存是已经被导入过的模块>如果已经被导入了就不再导入而直接使用对象的属性

            2): 如果没有找到 python就是去 sys.path 搜索 <创建空对象《和模块名是同名的》>,如果没有到 抛出异常

            3): 根据模块文件A.py 导入到python解释器中 根据模块文件往对象中新增对应的属性

            4): 把模块对象的属性名 添加到本地作用域   

        查看本地作用域的所有名字<本地名字空间> locals()

3:修改模块中的一个属性

      1):如果属性是不可变类型的  

            From A import B方式:在当前作用域只是保存的是模块对象A中属性B的引用,只会在当前作用域修改B的值,不会修改模块对象中的B属性的值

            Import A方式:当前作用域保存的是模块对象的引用,所以能够修改 模块属性的值

      2):如果属性是可变类型的

            from A import B方式:在当前作用域只是保存的是模块对象中属性B的引用 ,也就是说 B和A.B引用同样的数据,此时 如果在当前作用域修改B的值是能够修改属性的值。

            Import A方式:当前作用保存的是模块对象的引用,修改的就是模块对象当中的属性的值,所以能够修改 模块属性的值

例如:导入cat.py模块并修改模块对象的属性值