Python 中 import 的实现(importlib)


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

此包还公开了实现 import 的组件,使用户更容易创建自己的自定义对象(称为导入器)以参与 import 过程。

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

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

importlib.resources

此模块利用 Python 的 import 系统来访问包中的资源。

importlib.machinery

此模块包含帮助 import 查找和加载模块的各种对象。

importlib.util

此模块包含导入器的实用程序代码。它包含帮助构建导入器的各种对象。在其中定义了以下重要函数。

find_spec()

此函数查找模块的规范,相对于指定的包名称。如果名称是子模块(包含点),则会自动导入父模块。名称和包的工作方式与 import_module() 相同。

module_from_spec(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

更新于: 2019年7月30日

2K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告