美文网首页
importlib动态导入模块

importlib动态导入模块

作者: haoshengup | 来源:发表于2018-06-05 20:44 被阅读111次

      一般而言,当我们需要某些功能的模块时(无论是内置模块或自定义功能的模块),可以通过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

    相关文章

      网友评论

          本文标题:importlib动态导入模块

          本文链接:https://www.haomeiwen.com/subject/yobmsftx.html