python--导入,模块的引用,包,__name__

__name__

创建一个py文件,命名为 demo1.py,写下面一行代码

print(__name__)

执行

python--导入,模块的引用,包,__name__

从当前文件下运行,__name__就是__main__

在创建一个文件为demo2.py,导入demo1,运行demo2.py

python--导入,模块的引用,包,__name__

从demo2.py 里导入 demo1,__name__ 为导入的文件名

if __name__=='__main__':

上面这句话,当从当前文件执行的时候是True,从别的文件里执行为 False

if __name__ == '__main__':
     所有不需要调用就能执行的内容

导入

所有模块的导入,都相当于把要导入的模块中的代码放到被直接执行的文件下执行了

import 模块
导入这个模块之后 模块内的所有名字 就都可以通过模块来引用了
模块名.名字

from 模块 import 名字
导入这个模块中的某个名字之后,这个名字就可以直接使用了
名字是变量 直接用
名字是函数 函数名()就是调用
名字是类名 类名()就是实例化

模块的循环引用 - 不能

把模块当成脚本运行 :
    你希望 某一段代码 在被当做模块导入的时候 不要执行
    就把它写在 if __name__ == '__main__':下面

sys.path 一个自定义模块能否被导入,就看sys.path列表中有没有这个模块所在的绝对路径
import 模块名  # ModuleNotFoundError : No module named '模块名'

包
从包中导入模块,要注意这个包所在的目录是否在sys.path

如果是直接导入一个包,那么相当于执行了这个包中的__init__文件
并不会帮你把这个包下面的其他包以及py文件自动的导入到内存
如果你希望直接导入包之后,所有的这个包下面的其他包以及py文件都能直接通过包来引用
那么你要自己处理__init__文件

导入时的注意点

重新加载模块 已经导入的模块即便被修改在程序执行过程中也不会生效

from  import导入了什么 就能使用什么 不导入的变量 不能使用

当模块中导入的方法或者变量 和 本文件重名的时候,那么这个名字只代表最后一次对它赋值的哪个方法或者变量

在本文件中对全局变量的修改是完全不会影响到模块中的变量引用的(a.py文件导入了b.py文件里的name="zou",在a.py里写name=123,在执行b.name,还是zou)

__all__可以控制*导入的内容


import sys
import my_module
sys.modules   存储了所有导入的文件的名字和这个文件的内存地址
{'sys':文件的内存地址,
'my_module': my_module的地址
'__main__':当前直接执行文件所在的地址}
再使用反射自己模块中的内容的时候
import sys
getattr(sys.modules[__name__],变量名)

模块之间的调用

import my_module

导入一个模块发生了如下几件事

  1. 找到这个模块,开辟一块属于这个模块的命名空间
  2. 执行这个模块下的所有东西
  3. 把模块里的东西加载在内存里
  4. 模块名指向这个地址

模块的搜索路径全部存储在 sys.path 列表中

导入模块的顺序,是从前到后找到一个符合条件的模块就立即停止不在向后寻找

如果要导入的模块和当前执行的文件同级,直接导入即可。如果要导入的模块和当前执行的文件不同级,需要把要导入模块的绝对路径添加到 sys.path 列表中

python--导入,模块的引用,包,__name__

项目根目录为PycharmProjects,下面有个zouzou的目录,zouzou目录下有个day1-day15的目录,day1-day15下分别有个day1和day5的目录,day1下面有个test.py的文件。day5 下有个test1.py的文件,里面有个test2的函数

在day1下面的test.py写下面的代码 ,红色字体为结果

import sys, os

print(__file__)  # 当前运行目录下的相对路径,因为PyCharm是从根目录下查找的D:/PycharmProjects/zouzou/day1-day15/day1/test.py

print(os.path.abspath(__file__))  # 当前文件的绝对路径D:PycharmProjectszouzouday1 - day15day1	est.py

print(os.path.dirname(os.path.abspath(__file__)))  # 返回当前文件的目录绝对路径D:PycharmProjectszouzouday1-day15day1

print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
D:PycharmProjectszouzouday1-day15

base_path=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_path)  # 将base_path加入到环境变量

模块的循环引用

在模块的导入中,不要产生循环引用问题,如果发生循环导入了就会发现明明写在这个模块中的方法,确显示找不到

还是上面的 demo1.py 和 demo2.py,分别写如下内容

demo1.py

import demo2

demo2.func()

demo2.py

import demo1


def func():
    print('in the demo2')

运行demo1时会报错

python--导入,模块的引用,包,__name__

 python--导入,模块的引用,包,__name__

导入包,相当于执行了这个包下面的 __init__.py

# 如果这样导入了包下的policy,就要这样执行,点前面的都是包名,policy.py文件下有个get函数
import glance.api.policy
glance.api.policy.get()

import glance.api.policy as policy policy.get()
from glance.api import policy policy.get()