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')

  return True

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

#!/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不多介绍了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python导入模块包原理及相关注意事项

    包的使用 1.首次导入模块发生的事情3件事情 先产生一个执行文件的名称空间: 1.创建模块文件的名称空间 2.执行模块文件中的代码 将产生的名字放入模块的名称空间中 3.在执行文件中拿到一个指向模块名称空间的名字 2.什么是包? ​ 它是一系列模块文件的结合体,表示形式就是一个文件夹 ​ 该文件夹内部通常会有一个__init__.py文件 ​ 包的本质还是一个模块 3.首次导入包发生的事情 首次导入包: 先产生一个执行文件的名称空间 1.创建包下面的__init__.py文件的名称空间 2.执行

  • python中添加模块导入路径的方法

    python中自定义模块导入路径的方式主要有以下3种: (1)使用sys.path.append()随着程序执行,会动态地添加模块导入的路径,但是程序执行结束后就会立即失效(临时性的) import sys sys.path.append('自定义路径') (2)加入到环境变量PYTHONPATH用于当前用户 在用户主目录下有一个 .bashrc 隐藏文件,打开文件 sudo vim ~/.bashrc 添加单个路径的方法 export PYTHONPATH=<自定义路径>:$PYTHONPA

  • Python导入父文件夹中模块并读取当前文件夹内的资源

    在某些特殊情况下,我们的 Python 脚本需要调用父目录下的其他模块.例如: 在编写 GNE 的测试用例时,有一个脚本 generate_new_cases.py放在 tests文件夹中.而 tests 文件夹与 gne 文件夹放在同一个位置.其中 gne 文件夹是一个包.我现在需要从generate_new_cases.py 文件中导入 gne 里面的一个类GeneralNewsExtractor. 为了简化问题,我单独写了一个演示的样例.它的文件结构与每个文件中的内容如下: 现在,我直接在

  • 聊聊python在linux下与windows下导入模块的区别说明

    我就废话不多说了,大家往下看吧~ P |-A | a.py |-B | b.py 文件结构如上,在windows下 a想运行b中的方法,可以直接写成 from B impot b b.fun() 但是在linux中会出现 ModuleNotFoundError: No module named 'B' 可以通过引入sys添加路径解决 import sys sys.path.append("/P/B") from B impot b 在程序中为了也有良好的移植性,可以在代码中显式添加路径

  • python 模块导入问题汇总

    问题描述 此时start.py是启动程序,引入了core包中的user_control,transfer,withdraw三个模块文件 但执行start.py的时候,出现了以下错误: 上图中显示的问题是:在transfer.py导入user_control模块的时候,无法找到该模块. 问题查找 当时我就纳闷了,user_control和transfer在同一个包中,按理来说不用做任何处理就能导入.而且在导入user_control的时候也没有报错. 然后我单独执行了transfer.py文件,没

  • 详解python模块pychartdir安装及导入问题

    在迁移别人写好的脚本时,发现pychartdir没有导入,脚本执行报错.以下是报错内容: [modps@LGJF-ZYC5-MMSC-WEB02 ~]$ python /opt/aspire/product/modps/mopps/shell/dayreport_linux.py /etc/host.conf: line 1: bad command `nospoof on' Traceback (most recent call last): File "/opt/aspire/product

  • 在python中实现导入一个需要传参的模块

    最近跑实验,遇到了一个问题: 由于实验数据集比较多,每次跑完一个数据集就需要手动更改文件路径,再将文件传到服务器,再运行实验,这样的话效率很低,必须要专门看着这个实验,啥时候跑完就手动修改运行下一个实验.我个人无法忍受这样低效率,就想能不能有什么解决的办法. 我们期望的解决办法是通过命令行传参来解决这个问题,因为接下来是需要编写shell脚本来批量运行实验,如果用输入语句的方式显得太笨拙. 在编写实验代码的时候,我将所有的参数集中到一个py文件中,这样便于后期的维护,现在的问题就是需要通过命令行

  • Python xlrd模块导入过程及常用操作

    简介 读取Excle文档,支持xls,xlsx格式 安装:pip3 install xlrd 导入:import xlrd xlrd 模块方法 读取Excel file = 'route_info.xls' # 读取Excel信息,生成对象 read_book = xlrd.open_workbook(file) 获取sheet[表]相关方法,返回xlrd.sheet.Sheet()对象 sheet = read_book.sheets() # 获取全部sheet列表 print(sheet)

  • Python importlib动态导入模块实现代码

    阅读目录 一般而言,当我们需要某些功能的模块时(无论是内置模块或自定义功能的模块),可以通过import module 或者 from * import module的方式导入,这属于静态导入,很容易理解. 而如果当我们需要在程序的运行过程时才能决定导入某个文件中的模块时,并且这些文件提供了同样的接口名字,上面说的方式就不适用了,这时候需要使用python 的动态导入. importlib使用 如在scripts目录中保存着一些功能模块,向外提供类似的接口poc()和脚本描述信息descript

  • Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析

    本文实例讲述了Python动态导入模块:__import__.importlib.动态导入的使用场景.分享给大家供大家参考,具体如下: 相关内容: __import__ importlib 动态导入的使用场景 首发时间:2018-02-23 16:06 __import__: 功能: 是一个函数,可以在需要的时候动态导入模块 使用: __import__(模块名) 但对于多级目录,只会导入第一级 目录结构: mo1=__import__("des") mo2=__import__(&q

  • Python动态导入模块的方法实例分析

    本文实例讲述了Python动态导入模块的方法.分享给大家供大家参考,具体如下: 一.正常导入模块 正常模块导入方式: import module(模块路径) 同时导入多个模块: import os,sys,socket 二.动态导入模块 动态导入模块允许我们通过字符串形式来导入模块 2.1 __import__函数,接受一个字符串参数 import os, sys my_sys = __import__('sys') my_os = __import__('os') print(sys.vers

  • Python动态导入模块和反射机制详解

    一.前言 何谓动态导入模块,就是说模块的导入可以根据我们的需求动态的去导入,不是像一般的在代码文件开头固定的导入所需的模块. 何谓反射机制,利用字符串的形式在模块或对象中操作(查找/获取/删除/添加)成员. 下面进入具体实例介绍环节.先创建一个示例文件example.py,简单写入几个加减乘除函数,如下,方便下文讲解使用. flag = 1 # 此变量在介绍反射机制时会用到 def my_sum(a, b): return a + b def my_sub(a, b): return a - b

  • python 动态导入模块实现模块热更新的方法

    最近有个部署需求,需要读取py文件格式的配置项,我的实现思路是把配置文件解析到内存中.主要使用两种方法: importlib.import_module types.ModuleType 方法1.使用 import_module 动态导包 先来看看import module使用方法. 主要有两个参数: package:包名 name:模块名 返回 module 对象 现在开始实现动态导包,成功读取到配置项. import importlib settings = importlib.import

  • React Native中实现动态导入的示例代码

    目录 背景 多业务包 动态导入 Metro 打包原理 打包过程 bundle 分析 __d函数 __r函数 方案设计 分 识别入口 树拆分 bundle 生成 合 总结 背景 随着业务的发展,每一个 React Native 应用的代码数量都在不断增加,bundle 体积不断膨胀,对应用性能的负面影响愈发明显.虽然我们可以通过 React Native 官方工具 Metro 进行拆包处理,拆分为一个基础包和一个业务包进行一定程度上的优化,但对日益增长的业务代码也无能为力,我们迫切地需要一套方案来

  • python根据路径导入模块的方法

    本文实例讲述了python根据路径导入模块的方法,分享给大家供大家参考.具体方法如下: 常规做法如下: import sys sys.path.append('C:/full/path') from foo import util,bar 而要直接通过路径 import imp util = imp.load_source('util', 'C:/full/path/foo/util.py') 使用时使用util.method,此时并没有定义method method = util.method

  • python实现动态数组的示例代码

    实现一个支持动态扩容的数组并完成其增删改查 #通过python实现动态数组 """ 数组特点: 占用一段连续的内存空间,支持随机(索引)访问,且时间复杂度为O(1) 添加元素时间复杂度:O(n) 删除元素时间复杂度:O(n) """ class Arr: def __init__(self, capacity=10): """ 构造函数 :param capacity: 数组最大容量,不指定的话默认为10 "

  • Python重新加载模块的实现方法

    importlib 模块的作用 模块,是一个一个单独的py文件 包,里面包含多个模块(py文件) 动态导入模块,这样就不用写那么多的import代码, 典型的例子: 自动同步服务,每个网站都有一个py文件.主进程里收到同步任务,根据名称来动态导入对应的py文件,这样就不用写那么多的import代码.(有点类似java的工厂方法) 但是,importlib并不能解决我在线修改py源码,再不重启进程的情况下,使修改生效. 这种情况,可以使用reload() reload方法 为防止两个模块互相导入的

  • 详解Python编程中time模块的使用

    一.简介 time模块提供各种操作时间的函数 说明:一般有两种表示时间的方式: 第一种是时间戳的方式(相对于1970.1.1 00:00:00以秒计算的偏移量),时间戳是惟一的 第二种以数组的形式表示即(struct_time),共有九个元素,分别表示,同一个时间戳的struct_time会因为时区不同而不同 year (four digits, e.g. 1998) month (1-12) day (1-31) hours (0-23) minutes (0-59) seconds (0-5

随机推荐