在Python中实现导入(importlib)

importlib软件包提供了可移植到任何Python解释器的Python源代码中import语句的实现。这也提供了比用Python以外的其他编程语言实现的实现更容易理解的实现。

该软件包还公开了实现导入的组件,使用户可以更轻松地创建自己的自定义对象(称为导入程序)以参与导入过程。

importlib软件包具有一个重要的函数,名为import_module()

import_module():

此函数以编程方式导入模块。模块名称是功能的第一个参数。可选的第二个参数指定软件包名称(如果有)。

invalidate_caches():

此功能使查找器的内部缓存无效。如果在程序运行时创建/安装了任何模块,则应调用此函数,以确保所有查找者都将注意到新模块的存在。

reload():

此功能将重新加载先前导入的模块。如果您已使用外部编辑器编辑了模块源文件,并且想在不离开Python解释器的情况下尝试新版本,则这将非常有用。

例:

创建两个名为module1.py和module2.py的Python脚本,其代码如下:

#module1
def main():
   print ('module imported', __name__)
   return
if __name__=='__main__':
   main()

现在,我们使用importlib软件包动态导入这些模块。

>>> import importlib
>>> mod=importlib.import_module('module1')
>>> mod.__name__
'module1'
>>> mod=importlib.import_module('module2')
>>> mod.__name__
'module2'
>>> mod.main()
module imported module2
>>>

importlib软件包包含以下子模块:

importlib.abc

此模块包含导入使用的所有核心抽象基类。还提供了一些核心抽象基类的子类,以帮助实现核心ABC。

importlib.resources

该模块利用Python的导入系统来提供对包内资源的访问。

importlib.machinery

该模块包含有助于导入查找和加载模块的各种对象。

importlib.util

该模块具有用于进口商的实用程序代码。它包含有助于构建进口商的各种对象。其中定义了以下重要功能。

find_spec():

此功能查找相对于指定软件包名称的模块规格。如果名称用于子模块(包含点),则将自动导入父模块。名称和包的工作方式与import_module()相同。

module_from_spec(规格)

基于spec和spec.loader.create_module创建一个新模块。

例:

import importlib.util
def check_module(mod):
   spec = importlib.util.find_spec(mod)
   if spec is None:
      print('Module: {} not found'.format(mod))
      return None
   else:
      print('Module: {} can be imported!'.format(mod))
      return spec
   def import_module(spec):
      mod = importlib.util.module_from_spec(spec)
      spec.loader.exec_module(mod)
      return mod
if __name__ == '__main__':
   spec = check_module('notamodule')
   spec = check_module('module1')
   if spec:
      mod = import_module(spec)
      mod.main()

输出:

Module: notamodule not found
Module: module1 can be imported!
module imported module1