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

本文详细介绍了Python中的模块引用,包括`__name__`的使用、模块导入方式、包的管理、`sys.path`、循环引用及解决办法。通过示例解释了如何在不同层级目录下导入模块,并强调了避免循环引用的重要性。
摘要由CSDN通过智能技术生成

__name__

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

print(__name__)

执行

6f7f66988ca8ab1998f8c23cb6c93c71.png

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

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

e9ce65e94cd522401d1b094dd0679ffe.png

从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

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

找到这个模块,开辟一块属于这个模块的命名空间

执行这个模块下的所有东西

把模块里的东西加载在内存里

模块名指向这个地址

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

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

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

630ccdcd402632565e9c1b2c93e5d642.png

项目根目录为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:\PycharmProjects\zouzou\day1 - day15\day1\test.py

print(os.path.dirname(os.path.abspath(__file__))) # 返回当前文件的目录绝对路径D:\PycharmProjects\zouzou\day1-day15\day1

print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

D:\PycharmProjects\zouzou\day1-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时会报错

efb0e0a947ca24cf414f17a5cccd2117.png

5277400f146b41c827d03247cc4770d7.png

导入包,相当于执行了这个包下面的 __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()

标签:__,name,python,py,导入,模块,import,path

来源: https://www.cnblogs.com/zouzou-busy/p/13236565.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值