python模块导入
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python模块导入相关的知识,希望对你有一定的参考价值。
一、模块的本质
我们写python程序经常会导入很多模块,那到底模块是什么呢?其实模块就是一个python文件,我们导入模块时的模块名就是python文件的名字,比如我们写了一个叫my_module.py的文件就可以当作模块导入其他python文件中,模块名就是my_module。
二、模块导入的两种方式
2.1、import
2.1.1、import导入模块时会做三件事:
1、为该模块生成一个独立的命名空间
2、在该命名空间中将模块的代码执行一遍
3、建立模块名到该命名空间的引用
2.1.2、别名
当我们导入的模块名太长不方便调用,或者跟我们自己定义的函数名或变量名有重名的时候怎么办呢?这个时候就可以使用as关键字给模块起个别名,之后在带哦用模块中的函数或变量时就用这个别名就可以了,比如
import random as r
print(r.randint(1,5))
--------------------------------------------------------------------------------------
4
2.1.3、一行导入多个模块
python支持import后跟多个模块名,用逗号分割即可
import random ,os,sys
2.2、from import
2.2.1、与import的区别
from import也会为模块创建独立的命名空间,但是它直接将import后的名字导入到了当前命名空间,我们可以直接使用这个名字不需要用模块名.名字的方式了,比如
from collections import namedtuple
Point=nametuple(‘Point‘,[‘x‘,‘y‘])
p=Point(1,2)
print(p.x,p.y)
--------------------------------------------------------------------------------------
1 2
但是需要注意的是,如果后面有跟这个导入的名字重名的情况的话,这个被导入的名字就会被后面的覆盖了
2.2.2、别名
from import也支持使用as关键字给导入的名字起别名,同样在后续使用时也是使用这个别名了
2.2.3、同时导入一个模块的多个名字
from import支持一行导入多个名字,比如
from collections import namedtuple,OrderedDict,defaultdict,deque,Counter
Point=namedtuple(‘Point‘,[‘x‘,‘y‘])
p=Point(1,2)
print(p.x,p.y)
--------------------------------------------------------------------------------------
1 2
2.2.4、from import *
from import *可以将模块中除了下划线_开头的变量外的所有名字都导入当前命名空间,同时我们可以配合使用__all__=[‘名字1‘,‘名字2‘]的方式控制哪些名字可以被导入,但是大部分情况下不建议这样导入,因为我们不知道模块中有哪些名字,会不会跟现有代码中的名字重名
三、模块重新加载
python是不支持重新加载模块或者卸载已加载的模块的,因此一旦程序运行后,对模块的修改都不会生效,一般情况下只能重新启动程序,但是有一种方法可以在程序运行的时候重新加载模块,就是importlib模块的reload方法,在导入了importlib模块后,我们可以使用importlib.reload(模块名)的方式重新加载模块,但是只建议在测试的时候使用。
四、控制模块的执行逻辑
在python内置的全局变量中有一个__name__的变量,它的值会根据python文件被执行的方式不同而不同,如果python文件是直接执行的那么它的变量值就是__main__,如果是被当作模块间接执行的那么它的变量值就是模块名,利用这个我们就可以控制一个python文件中的代码在直接执行时才执行否则就不执行
五、模块搜索顺序
python在搜索模块时会先找内存中已加载的模块,然后到内置模块中查找,最后从sys.path中包含的路径中按顺序查找,这里我们需要注意一点,我们自己定义的模块名不要跟内置模块重名,否则重名的那个内置模块就无法使用
六、python编译文件
python解释器在执行python时会把第一次加载的模块进行一次编译生成.pyc的文件,下次就会直接加载这个.pyc文件而不是模块文件,这样的好处就是在模块加载的时候会加快速度,但是默认不会给其他python文件生成.pyc文件,我们可以在运行python文件时用python -m XXX.py的方式让python给这个python文件也生成一个.pyc的文件
七、包
python中的包其实就是一个包含__init__.py文件的文件夹,我们在导入一个python包的时候实际上就是导入了这个文件而已。
绝对导入:就是在from中指定具体的子模块路径,比如from glance.cmd import manage
相对导入:就是用点代表子模块前的路径,子模块外有几层包就需要几个点,比如from .cmd import manage。相对导入只能在同一个包内使用并且只有子模块被其他文件导入执行时才能正常执行。
以上是关于python模块导入的主要内容,如果未能解决你的问题,请参考以下文章