Python模块的查找顺序
在上几篇文章中已经用了如os,shutils,json等多个模块,这些模块都是python的内置模块。相比之下,我们刚才使用的calc模块就是自定义模块。
假设我们使用importcalc导入calc模块,python在启动时按照什么样的顺序来查找这个模块呢?
先查找内置(built-in)模块中有没有,如果没有转到2
查找sys.path变量指定的路径下有没有,有的话就使用,没有就报错
sys.path变量中存储了那些路径呢?
当前运行的python脚本所在的目录
环境变量PYTHONPATH中的路径,它和shell环境变量PATH差不多
这个变量可以使用python脚本在运行时修改它
默认的python安装包的路径
想要看下你的电脑当前sys.path有哪些路径吗?运行下面代码就可以
importsys
print(sys.path)
查找模块的顺序是从前向后,只要查到就使用,因此这个变量存储路径的顺序很重要。
模块中包含执行语句的情况
如果引入的模块中包含一些执行语句,那么在导入模块时这些语句就会执行。但是即使同样的模块被导入了两次,这些语句也只能执行一次。
来看下面的例子,定义calc模块
print('Iamclacmodule')
defplus(a,b):
returna+b
defsubtract(a,b):
returna-b
并且在main.py中定义导入两次calc模块的函数
fromcalcimportplus
fromcalcimportsubtract
print(plus(1,2))
print(subtract(1,2))
结果是'Iamclacmodule'只会被打印一次。
用dir()函数来窥探模块
dir()函数是python的内置函数,可用来获取模块的属性,方法等信息,当我们刚接触一个模块,不清楚它由哪些有用的属性和方法时,就可以用dir()来一探究竟。
以常用的json模块为例,我们来展示下它的属性和方法
importjson
print(dir(json))
#['JSONDecodeError','JSONDecoder','JSONEncoder','__all__','__author__','__builtins__','__cached__','__doc__','__file__','__loader__','__name__','__package__','__path__','__spec__','__version__','_default_decoder','_default_encoder','codecs','decoder','detect_encoding','dump','dumps','encoder','load','loads','scanner']
其中以双下划线开头的变量,如__name__并非是模块自己定义的,而是与模块相关的默认属性。
如果我想查看当前模块内的所有属性和方法呢?去掉dir()函数的参数就可以。拿上节的代码为例来看下。
fromcalcimportplus
fromcalcimportsubtract
print(plus(1,2))
print(subtract(1,2))
print(dir())
#['__annotations__','__builtins__','__cached__','__doc__','__file__','__loader__','__name__','__package__','__spec__','plus','subtract']
我们会看到calc模块的plus和substract方法也展示了出来,那么dir函数究竟是从哪里获取的数据,背后的机理是什么呢?
其实每个模块内部都有一个子集的私有符号表,它就是模块内所有函数和方法共享的全局符号表。当模块B导入模块A时,就会把要导入的模块A或者特定的方法,属性放置到模块B的全局符号表中,dir()函数也就是从模块中的全局符号表中获取出的值。
以上内容为大家介绍了Python模块的查找顺序,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。http://www.mobiletrain.org/
相关推荐HOT
更多>>Python企业应用的优缺点
Python是软件开发领域一朵诱人的奇葩:人们经常把Python看作是一种起到缝合作用的严格脚本语言,不过却很少有人意识到Python已经足够强大到应用...详情>>
2023-11-11 21:01:20Python 之什么是类,什么是对象?
类即类别、种类,是面向对象设计最重要的概念,从一小节我们得知对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体。那么...详情>>
2023-11-11 18:20:34Python 爬虫之pyspider
pyspider是一个支持任务监控、项目管理、多种数据库,具有WebUI的爬虫框架,它采用Python语言编写,分布式架构。详细特性如下:拥有Web脚本编辑...详情>>
2023-11-11 17:49:48python RSA加密算法过程
1,随机选取两个质数p和q2,计算n=pq3,选取一个与Ø(n)互质的小奇数e,Ø(n)=(p-1)(q-1)4,对模Ø(n),计算e的乘法逆元d,即满足(e*d)modØ(n)...详情>>
2023-11-11 17:20:50