importlib动态导入模块

  一般而言,当我们需要某些功能的模块时(无论是内置模块或自定义功能的模块),可以通过import module 或者 from * import module的方式导入,这属于静态导入,很容易理解。

  而如果当我们需要在程序的运行过程时才能决定导入某个文件中的模块时,并且这些文件提供了同样的接口名字,上面说的方式就不适用了,这时候需要使用python 的动态导入。

  还有一种情况:我们有时希望从配置文件等地获取要被动态加载的 module,但是所读取的配置项通常为字符串类型,无法用 import 加载,例如:

>>> import 'os'
 File "<stdin>", line 1
 import 'os'
 ^
SyntaxError: invalid syntax

  具体有两种方法可以实现动态导入:

1、用import_module函数执行导入操作。


def import_module(name, package=None)
其中,name:为字符串形式,是要导入的模块


栗子:

import importlib

class test():
    def num(self):
        np = importlib.import_module('numpy')
        a = np.array([1,2,3])
        print(a)

    def num2(self):
        b = np.array([1,2,3])
        print(b)

def main():
    t = test()
    t.num()

# 下面的语句会报错,因为importlib.import_module导入的只是局部变量
    # t.num2()

if __name__ == '__main__':
    main()

输出结果:[1 2 3]

2、用Python 提供内建函数 _import_动态加载 module


import (name[, globals[, locals[, fromlist[, level]]]])


  • name (required): 被加载 module 的名称
  • globals (optional): 包含全局变量的字典,该选项很少使用,采用默认值 global()
  • locals (optional): 包含局部变量的字典,内部标准实现未用到该变量,采用默认值 local()
  • fromlist (Optional): 被导入的 submodule 名称
  • level (Optional): 导入路径选项,默认为 -1,表示同时支持 absolute import 和 relative import

(1)栗子:

In [21]: os_module = __import__('os')

In [22]: path = os_module.path.join('D','test')

In [23]: print(path)
D\test

注意:如果输入的参数如果带有 “.”,采用 _import_ 直接导入 module 容易造成意想不到的结果。


(2)栗子:

In [26]: osp = __import__('os.path')

In [27]: path = osp.join('D','test')
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-27-53ad0ef540e3> in <module>()
----> 1 path = osp.join('D','test')

AttributeError: module 'os' has no attribute 'join'

  错误提示说:os模块没有join属性,好像不太对,我们导入的明明是:os.path模块。这就说明 _import_ 只能导入第一级目录。

In [28]: __import__("os")
Out[28]: <module 'os' from 'd:\\programs\\python\\python36\\lib\\os.py'>

In [29]: __import__("os.path")
Out[29]: <module 'os' from 'd:\\programs\\python\\python36\\lib\\os.py'>

  从上面的结果可以看出: 两个导入的结果是一样的,说明“.”后面的没有被导入。

参考:
http://python.jobbole.com/87492/
https://www.cnblogs.com/progor/p/8462472.html
https://blog.csdn.net/weixin_39769379/article/details/78497990

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,904评论 18 139
  • Scala与Java的关系 Scala与Java的关系是非常紧密的!! 因为Scala是基于Java虚拟机,也就是...
    灯火gg阅读 3,482评论 1 24
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,236评论 4 16
  • 人生最好的态度是什么? 不是以梦为马地一路狂奔…… 不是争分夺秒地不息奋斗…… 人生最好的态度是不辜负…… 不辜负...
    黄大侠的传奇阅读 255评论 0 1
  • 云中歌已经读完了!初看之时已经发现它是大漠谣的续集,讲的是玉儿与霍去病女儿霍云歌的故事!故事也是从无边的大漠开始,...
    竹林逍遥阅读 202评论 0 0