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("从实例获取类失败")
Python 导入与注册的更多相关文章
- python路径写入注册表,导入三方模块win32
python在安装第三方模块时候,需要将python的路径写入注册表,否则会提示 'python version 3.8-32 required,which was not found in the ...
- python导入上级目录中的模块
python导入同级别模块很方便: import xxx 要导入下级目录页挺方便,需要在下级目录中写一个__init__.py文件 from dirname import xxx 要导入上级目录,可以 ...
- Python导入模块的三种形式
Python导入模块的3中方式: 1.import module_name 这样在程序里就可以通过module_name.metnod_name()的方式访问模块里的函数了 Example: > ...
- python 导入模块 import 理解
--python 导入模块 import 理解 -----------------------------------2014/03/18 python 导入一个模块的过程要求有一个叫做“路径搜索”的 ...
- python导入模块时的执行顺序
当python导入模块,执行import语句时,到底进行了什么操作?按照python的文档,她执行了如下的操作: 第一步,创建一个新的module对象(它可能包含多个module) 第二步,把这个mo ...
- python导入csv/txt文件
1. 导入csv文件 ### python导入csv文件的三种方法 ```python #原始的方式 lines = [line.split(',') for line in open('iris.c ...
- selenium + python自动化测试unittest框架学习(四)python导入模块及包知识点
在写脚本的时候,发现导入某些模块,经常报错提示导入模块失败,这里来恶补下python导入模块的知识点. 1.模块导入时文件查找顺序 在脚本中,import xxx模块时的具体步骤: (1)新建一个mo ...
- python 导入模块与使用
学习python之前一定要了解导入模块是怎么导入的,至少在看代码时不知道能很快的了解别人写的东西是哪里来. Python默认仅安装部分基础或核心模块,启动时也仅加载了基础模块,在需要是再显式的加载其他 ...
- python导入csv文件时,出现SyntaxError
背景 np.loadtxt()用于从文本加载数据. 文本文件中的每一行必须含有相同的数据. *** loadtxt(fname, dtype=<class 'float'>, commen ...
随机推荐
- 将hive的hql执行结果保存到变量中
这里分别针对shell脚本和python脚本举例: shell脚本如下: 注意:在hive语句左右两边使用的是ESC键下面的点号,不是单引号. #!/usr/bin/env bash test1=`h ...
- 关于Cocos2d-x程序运行时候提示关闭程序的框框的解决方法
1.这个情况是资源没有被加载的表现 如果AppDelegate.cpp里面没有文件索引的语句 FileUtils::getInstance()->addSearchPath("res& ...
- IOS内购支付server验证模式
IOS 内购支付两种模式: 内置模式 server模式 内置模式的流程: app从app store 获取产品信息 用户选择须要购买的产品 app发送支付请求到app store app store ...
- mysql 从sql存储文件恢复数据库乱码
场景一: 一台电脑上导出的sql文件到另一台电脑上恢复数据库,汉字全部是乱码,然后可能还有部分数据提示超长. 场景二: 拿到的sql文件不是原始的导出sql文件,只有表结构和表数据,出现的问题和场景一 ...
- R 中的do.call 函数
do.call 函数是一个高阶函数, 其第一个参数为一个函数名,或者匿名函数,第二个参数是一个list 对象, 其实是参数列表 比如读取文件test.txt, 内容为 read.table(input ...
- c#后台访问接口
直接上代码 后台代码 //接口地址string url = "http://spherefg.topsmoon.com:6666/restapi/Comment/SubmitCommentF ...
- CentOS7下Tomcat启动慢的原因及解决方案
现象 在一次CentOS 7系统中安装Tomcat,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的.Tocmat的Session ID是通过SHA1算法 ...
- xml & < 需要转义
写了个request2XML的方法,每当数据中有'<'.'&'符号时,封装的XML就无法解析.发现了XML里的CDATA属性,问题迎刃而解!在XML文档中的所有文本都会被解析器解析. 只 ...
- 在 SharePoint 2010 打开网页出错时,显示实际的错误信息
每次打开错误页面时,SharePoint出错显示的都是友好信息“发生意外错误”,而且友好到您基本上无法明白到底出什么错,怎么办? 修改Web.config文件配置就可以了,就可以显示更详细的信息: 1 ...
- Ant多渠道批量打包
由于我现在已经用更好的gradle了,所以关于ant我只是简单的讲一讲,如果想学gradle请到我的博客中查看 http://www.cnblogs.com/uncle2000 ant的配置请自行百度 ...