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

网友投稿 258 2022-08-25


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

__name__

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

print(__name__)

执行

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

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

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

模块之间的调用

import my_module

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

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

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

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

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

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

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

import sys, osprint(__file__) # 当前运行目录下的相对路径,因为PyCharm是从根目录下查找的D:/PycharmProjects/zouzou/day1-day15/day1/test.pyprint(os.path.abspath(__file__)) # 当前文件的绝对路径D:\PycharmProjects\zouzou\day1 - day15\day1\test.pyprint(os.path.dirname(os.path.abspath(__file__))) # 返回当前文件的目录绝对路径D:\PycharmProjects\zouzou\day1-day15\day1print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))D:\PycharmProjects\zouzou\day1-day15base_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 demo2demo2.func()

demo2.py

import demo1def func(): print('in the demo2')

运行demo1时会报错

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

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python--导入,模块的引用,包,__name__(python中模块的导入)
下一篇:异常排查记录amqp协议链接陷阱
相关文章

 发表评论

暂时没有评论,来抢沙发吧~