当前位置:   article > 正文

python importlib详解

importlib

题外话

很多Python源码中,会有一句if __name__ == '__main__':,其中__name__为python的一个内置类属性,存在于每一个python程序中,不同运行方式会出现不同的结果。

  1. 直接运行当前程序,文件中的__name__的值为“__main__”。
  2. 其他程序导入当前python程序,原文件中__name__的值为“原文件的名字”。

python的importlib模块

作用

动态导入需要的python程序文件的module,module可以用调用该模块下的所有属性和方法。

可从下面两个方面探讨:

  • module动态导入
  • 检查模块是否可以导入

module动态导入

文件结构

  1. a #文件夹
  2. │a.py
  3. │__init__.py
  4. b #文件夹
  5. │b.py
  6. │__init__.py
  7. ├─c#文件夹
  8. │c.py
  9. │__init__.py
  10. # c.py 中内容
  11. args = {'a':1}
  12. class C:
  13. def c(self):
  14. pass

当需要在a.py文件中调用c.py文件中的对象/方法时,可采用importlib.import_module函数

  1. #a.py
  2. 首先看一下importlib.import_module(name, package=None)函数的参数
  3. 函数调用存在两种方式:
  4. 1.绝对导入,name为完整路径str,package为None。
  5. 2.相对导入,package需指定对应包位置。
  6. import importlib
  7. #绝对导入
  8. params = importlib.import_module('b.c.c')
  9. #相对导入,注意路径前面有一个“.”,(这时__name__就可以派上用场)
  10. params_ = importlib.import_module('.c.c',package='b')
  11. # 对象中取出需要的对象
  12. params.args #取出变量
  13. params.C #取出class C
  14. params.C.c #取出class C 中的c 方法

检查模块是否可以导入

        并不是所有模块都可以成功导入,这时候可采用importlib.util.find_spec函数来判断查找的module是否存在。官方该函数的具体解析如下:

        importlib.util.find_spec(namepackage=None)

  •       3.4 新版功能. 查找模块的 spec,相对指定的 package 名为可选参数。如果该模块位于 sys.modules 中,则会返回 sys.modules[name].__spec__ (除非 spec为 None 或未作设置,这时会触发 ValueError)。否则将用 sys.meta_path 进行搜索。若找不到则返回 None。 如果 name 为一个子模块(带有一个句点),则会自动导入父级模块。name 和 package 的用法与 import_module() 相同。
  •        在 3.7 版更改: 如果 package 实际上不是一个包(即缺少 __path__ 属性)则会引发 ModuleNotFoundError 而不是 AttributeError

      可以发现在新版本中,importlib.util.find_spec在找不到模块的时候已经不返回None,而是直接引发ModuleNotFoundError异常了,这个需要注意一下。(当前测试过程中,如果父级目录不存在会报异常,若只有根目录不存在则返回None)

      

        

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/272252
推荐阅读
相关标签
  

闽ICP备14008679号