首页 > 编程语言 >python加载

python加载

时间:2024-03-10 20:45:47浏览次数:24  
标签:__ lib python module libraries print path 加载

# testInstance.py

# 导入需要的模块
import importlib  # 导入模块以动态加载库中的类和函数
import sys  # 导入系统模块,用于操作Python解释器的参数和变量
import os
import pkgutil


# 定义TestInstance类
class TestInstance:
    # 初始化方法,当创建TestInstance对象时调用
    def __init__(self, projectName):
        # 初始化实例变量projectName,存储项目名称
        self.projectName = projectName
        # 调用load_libraries方法加载库,并将结果存储在self.lib中
        self.lib = self.load_libraries()

        # 定义load_libraries方法,用于加载库

    def list_submodules(self,package_path):
        """递归地列出给定包路径下的所有子模块"""
        all_submodules = []

        # 遍历包路径下的所有文件/目录
        for importer, modname, ispkg in pkgutil.iter_modules([package_path]):
            full_modname = modname
            module_path = os.path.join(package_path, modname)

            # 如果是子包,则递归调用list_submodules
            if ispkg:
                # 构建子包的完整路径
                subpackage_path = os.path.join(module_path, '__init__.py')
                # 递归查找子包下的子模块
                submodules = self.list_submodules(subpackage_path)
                # 添加子模块名称到结果列表,同时保留子包的路径
                all_submodules.extend([full_modname + '.' + submodule for submodule in submodules])
            else:
                # 添加非包模块的完整名称
                all_submodules.append(full_modname)

        return all_submodules

    def load_libraries(self):
        # 导入配置模块
        import libconfig  # 假设存在一个名为libconfig的模块,其中包含库的加载顺序等信息
        # 初始化一个空字典,用于存储库中的类和函数
        libraries = {}

        # 将库路径添加到sys.path,以便Python能够找到这些库
        # sys.path.append(r"C:\Users\15773\Desktop\文心一言\新建文件夹\test_library\projectLib")  # 添加项目库路径
        # sys.path.append(r"C:\Users\15773\Desktop\文心一言\新建文件夹\test_library\commonLib")  # 添加通用库路径
        print("sys.path",sys.path)

        # 按照配置模块中指定的顺序加载库
        root = r"C:\Users\15773\Desktop\文心一言\新建文件夹\test_library"
        for lib_name in libconfig.libraries_order:  # 遍历库名列表
            # sys.path.insert(0,os.path.join(root, lib_name))
            libPath = os.path.abspath(os.path.join(root, lib_name))
            print("libPath",libPath,lib_name)
            allPac = self.list_submodules(libPath)
            print("allPac",allPac)
            # 动态导入库模块
            for library in allPac:
                print("library",library)
                module = importlib.import_module(library)  # 使用importlib导入库模块
                print("-----",dir(module))
                print("module.__file__",module.__file__)
                print([attr_name for attr_name in dir(module) if not attr_name.startswith('_')])


                # 将库模块中的非私有属性和方法添加到libraries字典中
                libraries.update(
                    {attr_name: getattr(module, attr_name) for attr_name in dir(module) if not attr_name.startswith('_')})

        print("libraries",libraries)

            # 创建一个类似命名空间的类,用于持有所有库中的类和函数

        class LibraryNamespace:
            # 定义__getattr__方法,当尝试访问不存在的属性时调用
            def __getattr__(self, item):
                print("--item",item)
                # 首先检查项目库中是否存在该属性
                if item in libraries:
                    print("item in lib-------------",item,libraries)
                    # return libraries[item]  # 如果存在,直接返回对应的类或函数
                    tempInstance = libraries[item]()  # 如果存在,直接返回对应的类或函数
                    return tempInstance
                # 如果在项目库中找不到,尝试从commonlib库中导入
                commonlib_module = importlib.import_module(f"commonlib.{item}")  # 动态导入commonlib中的模块或函数
                tempInstance = commonlib_module()
                print("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&")

                # return getattr(commonlib_module, item)  # 返回commonlib中的类或函数
                return getattr(tempInstance, item)  # 返回commonlib中的类或函数

        # 创建一个LibWrapper类,用于包装LibraryNamespace,并为其添加一个lib属性
        class LibWrapper:
            def __init__(self, namespace):
                # print("namespace",namespace)
                # 在LibWrapper实例初始化时,将LibraryNamespace实例赋值给lib属性
                self.lib = namespace

                # 返回LibWrapper的实例,其中包含了LibraryNamespace

        # return LibWrapper(LibraryNamespace())
        # print("namespace",LibraryNamespace)
        return LibraryNamespace()

    # 如果该脚本被直接执行(而不是作为模块导入),则执行以下代码


if __name__ == '__main__':
    # 假设当前项目名称为"projectlib"
    projectName = "projectA"
    # 创建TestInstance对象
    test = TestInstance(projectName)
    # print("test.lib",test.lib)

    # 调用lib.libA.greet方法,并传递参数"world"
    # 由于使用了__getattr__,即使libA或greet不存在,也不会立即抛出异常,而是会尝试从commonlib中导入
    print(test.lib.libA.greet("hello world"))
    print(test.lib.libA.greetB("BBB"))

 

标签:__,lib,python,module,libraries,print,path,加载
From: https://www.cnblogs.com/shunguo/p/18064756

相关文章

  • MPU6050 memcmp(firmware+ii, cur, this_write)初始化问题|MPU6050固件库加载问题
    使用MPU6050dmp固件库时候报错:MPU6050固件库加载,最后运行到“memcmp(firmware+ii,cur,this_write)”无法通过!从网上查找了相同问题的解答,发现修改了IIcSDA与SCL端口但是头文件的中的宏定义没有修改未修改之前的端口:修改之后的端口:这里在修改宏定义的时候遇到了些问......
  • python获取某个包下面的所有子模块
    deflist_submodules(self,package_path):"""递归地列出给定包路径下的所有子模块"""all_submodules=[]#遍历包路径下的所有文件/目录forimporter,modname,ispkginpkgutil.iter_modules([package_path]):full_......
  • Python简单实现查重
    使用Python实现查重这个作业属于哪个课程软件工程这个作业要求在哪里个人项目这个作业的目标初步认识软件开发流程,独立培养开发能力,熟悉PSP记录开发过程你可以在GitHub上找到本项目并下载额外三种算法代码Slave前言作为开发人员,不幸的是此前未曾接触熟悉过......
  • python酒店相似度推荐系统
    importnumpyasnpimportpandasaspdfromnltk.corpusimportstopwordsfromsklearn.metrics.pairwiseimportlinear_kernelfromsklearn.feature_extraction.textimportCountVectorizerfromsklearn.feature_extraction.textimportTfidfVectorizerfromsklear......
  • python实现批量运行命令行
    python实现批量运行命令行背景:对于不同参数设置来调用同一个接口,如果手动一条条修改再运行非常慢且容易出错。尤其是这次参数非常多且长。比如之前都是输入nohuppython-uexe.py>>../log/exp3.log2>&1&来运行一次,在exe中会设置参数并调用接口运行preditction_uni(input_f......
  • Python scapy模拟dhcp客户端
    安装scapyaptinstall-ypython3-scapy1.发送dhcpdiscover广播报文2.sniff抓包,收到dhcpoffer广播报文3.发送dhcprequest广播报文4.sniff抓包,收到dhcpack广播报文importthreadingfromscapy.allimport*fromscapy.layers.l2importEtherdefsend_dhcp_discover......
  • 群星璀璨的Python江湖,Python第三方库介绍
    如果Python语言是一个江湖,那么python第三方库就是一个个身怀绝技的江湖侠客,这些侠客在这偌大的江湖尽情挥洒着江湖侠气。有人名扬天下,有人默默无闻,有人纵横捭阖,有人黯然谢幕,每天都在上演人生的悲欢离合。那么什么是python第三方库呢?什么是python第三方库python是一门非常流行......
  • python
    ##python在python的学习中,我发现了其许多与c语言的不同之处。例如:`#判断输入整数是否在【0,100】之间num=eval(input("请输入一个整数:"))判断【0,100】ifnum>100ornum<0:print("输入整数小于0或大于100")else:print("输入整数在0到100之间(含)")`#python的输出p......
  • python 新版本flask创建接口方式
    importpymysqlfrompymysql.cursorsimportDictCursorfromflaskimportFlask,requestfromflask.json.providerimportDefaultJSONProviderfromflask_corsimportCORSfromdatetimeimportdatetime,datesqlconnect=pymysql.connect(user="root&q......
  • python字符串截取
    python中字符截取[-1]、[:-1]、[::-1]、[n::-1]等使用方法的详细讲解(建议留存)-@小浩-博客园(cnblogs.com)str(df.loc[df.目的地.isnull(),'路线名'].values)#表示提取出目的地为空的路线名的值并将他变成字符串#上面的提取方式是在只有一行的情况下,如果是多行就要用......