zoukankan      html  css  js  c++  java
  • 动态导入模块

    一、正常导入模块

      正常模块导入方式: import module(模块路径)

      同时导入多个模块: 

    import os,sys,socket
    

    二、动态导入模块

      动态导入模块允许我们通过字符串形式来导入模块

      2.1 __import__函数,接受一个字符串参数

    import os, sys
    
    my_sys = __import__('sys')
    my_os = __import__('os')
    
    print(sys.version)
    print(my_sys.version)
    
    print('-------------')
    print(os.getcwd())
    print(my_os.getcwd())
    
    
    # 输出
    
    3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)]
    3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)]
    -------------
    G:pythonuntitledstudy8
    G:pythonuntitledstudy8
    

      我们将sys, os 模块名当中参数传入__import__函数中,可以看出my_sys 和my_os 其实就是相当于 os , sys 模块了。

      2.2 __import__函数导入自己的模块

      我们在lib包中有一个test.py模块,我们如何通过__import__函数来导入该模块呢?  

    # test.py内容
    
    class Person(object):
    
        def __init__(self):
            self.name = 'bigberg' 
    # 导入模块
    
    mod = __import__('lib.test') # 相当于获取了 lib 的路径
    print(mod)
    obj = mod.test.Person()
    print(obj.name)
    
    
    # 输出
    
    <module 'lib' from 'G:\python\untitled\study8\lib\__init__.py'>
    bigberg
    

      2.3 动态导入模块列表  

    moduleNames = ['sys', 'os', 'socket']
    print(type(map))
    # 在python3 map函数不在是内置函数,而是class,返回的结果是 可迭代对象
    print(isinstance(map(__import__, moduleNames), Iterator))
    
    modules = list(map(__import__, moduleNames))
    
    print(modules[0].version)
    
    # 输出
    
    <class 'type'>
    True
    3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)]
    

      现在的modules[0] 就相当于 sys 模块了。

      2.4 importlib 模块

      动态导入模块时,python官方建议使用importlib模块,我们同样导入lib/test.py 

    import importlib
    
    mod = importlib.import_module('lib.test')  # mod相当于 test.py本身了,于上例不同
    print(mod)
    
    obj = mod.Person()
    print(obj.name)
    
    # 输出
    
    <module 'lib.test' from 'G:\python\untitled\study8\lib\test.py'>
    bigberg
    

      

  • 相关阅读:
    二叉树(8)----第一个二叉树K层节点和二进制部分K叶节点层,递归和非递归
    android文件缓存,并SD卡创建目录未能解决和bitmap内存溢出解决
    Ubuntu Ruby On Rails安装和配置
    Atitit.升级软件的稳定性---基于数据库实现持久化 循环队列 循环队列
    ORACLE经常使用的命令
    增加 Java 有几个好习惯表现
    HTML5学习资源
    FFT 的C 语言
    MongoDB在window下的安装
    白话经典算法系列之七 堆与堆排序
  • 原文地址:https://www.cnblogs.com/bigberg/p/7746828.html
Copyright © 2011-2022 走看看