zoukankan      html  css  js  c++  java
  • python中importlib实现模块的动态导入

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

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

    importlib使用

      如在scripts目录中保存着一些功能模块,向外提供类似的接口poc()和脚本描述信息description,需要传入一个参数target,当然脚本执行的功能是不一样的,以下只是举例:

    复制代码
    starnight:EXP-M starnight$ ls scripts/
    __init__.py     __pycache__     test1.py        test2.py        test3.py
    starnight:EXP-M starnight$ cat scripts/test1.py 
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    description = 'it is a test1'
    

    def poc(target):
    print('it is a test1')

    </span><span style="color: rgba(0, 0, 255, 1)">return</span> True</pre>
    
    复制代码

      而我们需要动态传入脚本名,来选用此时要执行的功能:

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    

    import importlib

    script_name = input('please input script_name : ')     # 手动输入脚本名               
    module
    = importlib.import_module('scripts.{}'.format(script_name))    # 动态导入相应模块
    func
    = module.poc('')      # 执行脚本功能
    print(module.description)    # 获取脚本描述信息

    复制代码
    复制代码
    please input script_name : test1
    it is a test1
    it is a test1
    

    ...

    please input script_name : test3
    it is a test3
    it
    is a test3

    复制代码

      当我们动态给定脚本名字时,就会动态的导入该模块,执行相应的功能。

    importlib其他介绍

      python doc: importlib

      importlib中的几个函数:__import__、import_module、find_loader、invalidate_caches、reload

    "Note Programmatic importing of modules should use import_module() instead of this function."

      当进行编程时,使用import_module,如上使用该模块。

      find_loader用来查找模块,reload重新载入模块,invalidate_caches不多介绍了。

  • 相关阅读:
    JS 缓动动画封装函数
    JS 实现商品图片放大镜(大图)效果
    JS 实现春节倒计时效果
    HMTL+CSS 实现图片旋转木马效果
    HTML 解决video标签播放视频看不见&能听到声音看不到画面等问题
    GoLang Json数据的的序列化与反序列化
    GoLang 解决VsCode中提示错误 go: cannot find main module, but found .git/config in D:XXXsrcXXX to create a module there, run: cd .. && go mod init
    Flutter 容器(3)
    Flutter 容器 (2)
    Flutter 容器 (1)
  • 原文地址:https://www.cnblogs.com/leilijian/p/13778748.html
Copyright © 2011-2022 走看看