importlib软件包提供了可移植到任何Python解释器的Python源代码中import语句的实现。这也提供了比用Python以外的其他编程语言实现的实现更容易理解的实现。
该软件包还公开了实现导入的组件,使用户可以更轻松地创建自己的自定义对象(称为导入程序)以参与导入过程。
importlib软件包具有一个重要的函数,名为import_module()
此函数以编程方式导入模块。模块名称是功能的第一个参数。可选的第二个参数指定软件包名称(如果有)。
此功能使查找器的内部缓存无效。如果在程序运行时创建/安装了任何模块,则应调用此函数,以确保所有查找者都将注意到新模块的存在。
此功能将重新加载先前导入的模块。如果您已使用外部编辑器编辑了模块源文件,并且想在不离开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软件包包含以下子模块:
此模块包含导入使用的所有核心抽象基类。还提供了一些核心抽象基类的子类,以帮助实现核心ABC。
该模块利用Python的导入系统来提供对包内资源的访问。
该模块包含有助于导入查找和加载模块的各种对象。
该模块具有用于进口商的实用程序代码。它包含有助于构建进口商的各种对象。其中定义了以下重要功能。
此功能查找相对于指定软件包名称的模块规格。如果名称用于子模块(包含点),则将自动导入父模块。名称和包的工作方式与import_module()相同。
基于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