zoukankan      html  css  js  c++  java
  • Python 导入与注册

    背景




    最近一直学习写一个POC扫描框架,但是不知道如何下手,正巧因为一些需要有朋友在研究POCSuite的实现原理,顺面蹭一些知识点,补一补Python基础的不足,为以后编写POC框架打地基。

    导入




    静态模块导入



    import os#直接导入python自带模块或第三方安装后的模块
    import mylib#直接导入自编写模块
    import core.lib.api#在python默认查找路径中添加包中的某模块(本地、官方和安装的第三方库的路径)
    import ..config.conf#相对路径中导入包中的模块
    
    import sys
    sys.path.append(path)
    import xxx#添加路劲到python查找路径后导入模块
    from xxx import xxx#从某包导入某模块或者从某模块导入莫对象
    from xx.xx.xx import xxx#从某包的某包(模块)导入某模块或者某对象
    

    以上都是常见的静态导入方法,下面来解释下导入原理,这里按照python2来介绍:

    globals()和locals()


    globals()返回一个包含全局对象的一个字典,包含创建的各种全局变量--自定义类及其实例、数据类型及其实例等等,locals()是局部的的

    导入后

    sys.modules


    引用一段话来说明(加入globals(),并做检查了,而不是locals())
    Python中所有加载到内存的模块都放在sys.modules。当import一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加载了则只是将模块的名字加入到正在调用import的模块的Local名字空间中。如果没有加载则从sys.path目录中按照模块名称查找模块文件,模块文件可以是py、pyc、pyd,找到后将模块载入内存,并加入到sys.modules中,并将名称导入到当前的Local名字空间。

    动态导入



    导入的模块在运行到一定程度才能确定

    __import__(modName,globals(),locals(),[],-1)
    """
    []是formlist后面要加入某些模块的时候,在中间添加内容
    -1是相对+绝对引入
    0是绝对引入
    1是相对引入
    """
    from a import b
    #equals
    __import__(a,gloabls(),locals(),[b],-1)
    

    注册




    注册模块



    def moduleRegister(regModule):
        filename = os.path.basename(regModule)
        filepath = os.path.dirname(regModule)
        log.debug("开始检查待注册模块%s"%regModule)
        if regModule.__name__ in globals():
            log.info("%s模块名已经注册"%regModule)
            raise Exception("模块名已经注册")
        try:
            log.debug("开始注册模块%s"%regModule)
            __import__(filename,globals(),locals(),[],-1)
            log.debug("成功注册模块%s"%regModule)
        except Exception,reason:
            raise Exception("模块注册失败")
    

    注册类、实例对象



    #POCSUITE
    def registerPoc(pocClass):
        module = pocClass.__module__.split('.')[-1]
        if module in kb.registeredPocs:
            return
    
        kb.registeredPocs[module] = pocClass()
    

    把类对或者实例对象加入全局变量的字典里

    #引入依赖的外部对象、模块、包
    import os
    import sys
    
    
    #定义全局类和函数
    def registerCls(regMod,clsName):
        filename = os.path.basename(regMod)
        filepath = os.path.dirname(regMod)
        try:
            __import__(filename,globals(),locals(),[clsName],-1)
        except Exception,reason:
            raise Exception("模块注册失败")
    
    def registerMod(regModule):
        filename = os.path.basename(regModule)
        filepath = os.path.dirname(regModule)
        try:
            __import__(filename,globals(),locals(),[],-1)
        except Exception,reason:
            try:
                sys.path.append(filepath)
            except Exception,reason:
                raise Exception("模块注册失败")
    
    def getVarByMod(regMod,varName):
        try:
            return getattr(regMod,varName)
        except Exception,reason:
            raise Exception("从模块获取变量对象时失败")
    
    
    def getFuncByMod(regMod,funcName):
        try:
            return getattr(regMod,funcName)
        except Exception,reason:
            raise Exception("从模块获取方法对象时失败")
    
    def getClsByMod(regMod,clsName):
        try:
            return getattr(regMod,clsName)
        except Exception,reason:
            raise Exception("从模块获取类对象时失败")
    
    def getClnByCls(clsObj,clnName):
        try:
            return getattr(clsObj,clnName)
        except Exception,reason:
            raise Exception("从类中获取属性失败")
    
    def getFuncByCls(clsObj,funcName):
        try:
            return getattr(clsObj,clnName)
        except Exception,reason:
            raise Exception("从类中获取属性失败")
    
    def createClsIst(clsObj,*args,**kwargs):
        try:
            return clsObj(*args,**kwargs)
        except Exception,reason:
            raise Exception("创建实例失败")
    
    def executeFunc(funcObj,*args,**kwargs):
        try:
            return funcObj(*args,**kwargs)
        except Exception,reason:
            raise Exception("执行函数失败")
    
    def getClsByIst(regObj):
        try:
            return regObj.__class__
        except Exception,reason:
            raise Exception("从实例获取类失败")
    
  • 相关阅读:
    Google哲学(一)
    Predictably Irractional 相对论的真相
    .NET使用OpenSSL生成的pem密钥文件【做电子商务的朋友可能需要】
    从开辟蓝海到保卫蓝海(一)
    礼让?
    登门槛策略
    从开辟蓝海到保卫蓝海(四)
    盛大招聘 高级数据库开发工程师 工作地点张江高科 学历高者,经验可放宽
    Show一下拿的奖杯
    我们家的一坨和田仔玉[三色皮]
  • 原文地址:https://www.cnblogs.com/KevinGeorge/p/8962393.html
Copyright © 2011-2022 走看看