python 土拨鼠库_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("从实例获取类失败")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值