Python模块的查找顺序

来源:千锋教育
发布时间:2023-11-05 19:03:55
分享

在上几篇文章中已经用了如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培训机构:千锋教育。https://www.mobiletrain.org/


声明:本站部分稿件版权来源于网络,如有侵犯版权,请及时联系我们。

相关推荐

  • Python循环应该怎么写? 说到处理循环,我们习惯使用for,while等,比如依次打印每个列表中的字符:lis=['I','love','python']foriinlis:pr
  • 优化 Python 程序的内存占用 Python的垃圾回收机制通过引用计数来决定一个对象要不要被回收。当一个对象被引用次数为0时,它就会被作为垃圾回收从而释放Python内存。但有些情况下,我们的代码可能在不经意间导致某些实际上我们不再
  • Python 中如何处理文件系统路径 1不同操作系统分隔符在Windows操作系统中,文件路径以倒斜杠作为文件夹之间的分隔符。但在OSX和Linux上,使用的则是正斜杠作为路径分隔符。如果希望让程序适配所有操作系统,就会用到os.path
  • Python数据结构的时间复杂性 1.让我们了解大O符号的含义是什么?在算法中执行许多操作。这些操作可能包括遍历集合,复制项目或整个集合,将项目追加到集合中,在集合的开始或结尾处插入项目,删除项目或更新集合中的项目。Big-O衡量算法
  • Python的6种方式实现单例模式 单例模式是一个软件的设计模式,为了保证一个类,无论调用多少次产生的实例对象,都是指向同一个内存地址,仅仅只有一个实例(只有一个对象)。实现单例模式的手段有很多种,但总的原则是保证一个类只要实例化一个对
  • Python内置函数 python中有许多内置函数,不像print那么广为人知,但它们却异常的强大,用好了可以大大提高代码效率。这次来梳理下8个好用的python内置函数。1、set()当需要对一个列表进行去重操作的时候,