首页 > 编程语言 >python 如何动态加载lib中的函数

python 如何动态加载lib中的函数

时间:2024-04-27 20:57:46浏览次数:27  
标签:__ name lib python self module className 加载

class TestInstance:
    def __init__(self):
        # 初始化库字典,存放找到的库
        self.lib = Proxy()  # 使用一个代理对象来模拟层级结构
        


class Proxy:
    def __init__(self):
        self._libObjectDictCache = {}

    def _getLibInstance(self, libName):
        """
        返回lib的对象
        :param libName:
        :return:
        """
        # 加载projectlib
        libNameProject, getProjectLibRes = self._load_lib_folder(r'projectLib\projectA', libName)
        # 加载commonlib,如果projectlib中没有找到对应的库,这里会作为后备
        libNameCommon, getCommonLibRes = self._load_lib_folder(r'commonLib', libName)


        if getProjectLibRes and getCommonLibRes:
            classes = (libNameProject, libNameCommon)
       # 这里会生成有一个新的类,新类先继承project中的类, 在继承 common lib中的类 cls = type('new_'+libName, tuple(classes), {}) elif getCommonLibRes: cls = libNameCommon elif getProjectLibRes: cls = libNameProject else: raise Exception("can not get lib {}".format(libName)) obj = cls() return obj def _load_lib_folder(self, folder_name, libName): import os import importlib # 获取库文件夹的绝对路径 lib_folder_path = os.path.join(os.path.dirname(__file__), folder_name) print("lib_folder_path",lib_folder_path) def import_module_by_path(module_path, module_name): """ 根据给定的完整路径动态导入模块 """ spec = importlib.util.spec_from_file_location(module_name, module_path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module # 遍历库文件夹中的所有文件 getLib = False className = None for filename in os.listdir(lib_folder_path): if filename.endswith('.py') and filename != '__init__.py': # 移除文件扩展名,得到库名 lib_module_name = filename[:-3] print("lib_module_name {} libName {}",lib_module_name ,libName) if lib_module_name == libName: modulePath = os.path.join(folder_name,filename) # 使用绝对导入加载库模块 module = import_module_by_path(modulePath, lib_module_name) # 将库模块添加到lib代理对象的层级结构中 #self.lib 现在是module的集合 ,lib.libA这样的调用返回的来是module,而不是class className = getattr(module, lib_module_name) print("className",className, type(className)) # 把module 里面的class 绑定给self.lib, className()是className的对象,className是一个lib 类class # setattr(self.lib, lib_module_name, className()) # 不绑定给self.lib 而是return className() 出来 getLib = True return className, getLib def __getattr__(self, name): try: print("already") obj = self._libObjectDictCache[name] except KeyError: obj = self._getLibInstance(name) self._libObjectDictCache[name] = obj return obj class MyTest(TestInstance): def test_greet(self): # 调用projectlib中的greet函数 self.lib.libA.greet("namename") print("---------------") self.lib.libA.greetB("namename") if __name__ == '__main__': my_test = MyTest() my_test.test_greet()

 

标签:__,name,lib,python,self,module,className,加载
From: https://www.cnblogs.com/shunguo/p/18162501

相关文章

  • python虚拟环境
    主要是解决自己的一些疑问:1、python的虚拟环境其实就是对我们真实安装python的另一份。2、当我们在pip时,我们经常只会安装一个包,但是却经常要安装依赖包,再删除时却只会删除我们安装的那个包,其它依赖包留了下来,这样就不好对包进行管理,下次我们安装相同包的不同版本时,就会出现目标......
  • Java(2)-粗解类加载器
    Java的类加载器是Java运行时环境中的重要组件,核心功能是将类的字节码加载到Java虚拟机中。举个例子可以通过一个图书馆的比喻来形象地解释类加载器的作用、用法和使用场景。想象一下,有一个巨大的图书馆(JVM),其中有非常多的藏书(类)。当你(程序)需要阅读一本书(使用一个类)时,你首先需要......
  • python库使用总结
    python库的使用1:print(补充)2:math2.1:math库包括的4个数学常数2.2math库中的函数幂对数函数三角曲线函数3:字符串处理函数补充:sorted(str)对字符串中的元素进行排序,返回排序后的列表,而不是字符串​ reversed(str)对字符串中的元素反向输出3.1字符串......
  • python学习思维导图分享
    python本文包含了我的一些python学习的笔记和思维导图第一部分:python基础导图下载链接第二部分:函数及其他文件操作导图下载链接第三部分:类及网络编程导图下载链接第四部分:mysql导图下载链接......
  • 深入理解Python协程:从基础到实战
    title:深入理解Python协程:从基础到实战date:2024/4/2716:48:43updated:2024/4/2716:48:43categories:后端开发tags:协程异步IO并发编程Pythonaiohttpasyncio网络爬虫第1章:协程基础1.1协程概念介绍协程(Coroutines)是一种特殊的软件构造,它允许程序在执......
  • Go的Gin框架中使用Cgo调用Python的CApi调用Python代码
    在Gin项目中定义Services用以唤起Python,值得注意的是需要在引入Python.h前使用#cgo声明依赖库packagecpython//#cgoCFLAGS:-I"Q:/Sill-/anaconda/envs/poetry/include"//#cgoLDFLAGS:-L"Q:/Sill-/anaconda/envs/poetry/libs"-lpython311//#include<Python.h>imp......
  • Python (GUI编程)模块 使用方法
    GraphicalUserInterface,简称GUI,中文名为图形用户界面,又称图形用户接口,是一种通过图形元素(如按钮、文本框、图像等)来与计算机程序进行交互的方式。与传统的命令行界面相比,GUI更加直观和易于使用,因为用户可以直接通过点击、拖拽等方式来完成任务,而无需记忆和输入复杂的命令。GUI......
  • Python 潮流周刊#48:Python 3.14 的发布计划
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。本期分享了12篇文章,11个开源项目,赠书5本《图解TCP/IP(第6版)》,以下是周刊......
  • [SUCTF 2019]Pythonginx
    [SUCTF2019]Pythonginx打开环境@app.route('/getUrl',methods=['GET','POST'])defgetUrl():url=request.args.get("url")host=parse.urlparse(url).hostname//urlparse对url中的各个组成部分进行分割ifhost=='suctf......
  • Matplotlib 设置x轴的标签
    在Matplotlib中,如果你有一个时间序列数据,并且x轴上的时间标签太多导致它们重叠或难以阅读,你可以通过几种方法来减少显示的标签数量或调整它们的格式。以下是一些常用的方法:使用plt.xticks()手动设置x轴标签:你可以通过plt.xticks()手动设置你想显示的x轴标签的位置和文本。imp......