python函数 模块先加载到内存后执行_Python从内存中使用编译后的模块
在Windows编程的时候,有些时候,我们经常会要使用一些非常规的方法,比如说从内存中加载DLL,然后使用DLL中的函数。于是就思索在用Python的时候是否能够将几个编译好的Pyc合并成一个,然后使用动态的读取这个文件,然后根据标记进行划分,获得不同的模块的pyc内容,然后动态作为一个新的模块引用到我们的程序中去,这就涉及到一个问题,如何将一个pyc整到内存,然后从内存中获取变成一个新模块进行引入处理。之后找了一些资料之后,发现一种方法,就是通过PyCodeObject这个代码对象来进行处理,也就是用compile编译之后的内容,然后读取形成codeobject对象,然后用types.ModuleType建立一个新的模块,然后将这个新模块加入到sys.modules字典中去,之后在这这个新建的模块环境中执行前面读取的codeObject对象,那么久可以使用这个新的导入模块了,方式如下:
#代码如下:
PycContext = open('test.pyo', 'rb').read()importmarshal#可以查看PyCodeObject数据结构前面8个位是一个4字节MagicNum和4字节的时间戳,所以从第八位开始
PyCodeObject = marshal.loads(b[8:])importtypes#建立一个名字叫testSimple的新模块
newModule = types.ModuleType('testSimple')importsys
sys.modules['testSimple'] =newModule#这个时候已经可以用import testSimple了#但是运行时候会发现,这个新模块什么功能函数都没有,因为还没有和#上面的PyCodeObject关联起来,此时需要关联#就是使用exec在本模块环境执行一次,则可
exec c in newModule.__dict__
#这样,上面的codeObject和新模块就关联起来了,然后就可以使用里面的函数了
另外记录一个外国的资料代码如下
def load_compiled_from_memory(name, filename, data, ispackage=False):if data[:4]!=imp.get_magic():raise ImportError('Bad magic number in %s' %filename)#Ignore timestamp in data[4:8]
code = marshal.loads(data[8:])
imp.acquire_lock()#Required in threaded applications
try:
mod=imp.new_module(name)
sys.modules[name]= mod #To handle circular and submodule imports
#it should come before exec.
try:
mod.__file__ = filename #Is not so important.
#For package you have to set mod.__path__ here.
#Here I handle simple cases only.
ifispackage:
mod.__path__ = [name.replace('.', '/')]exec code in mod.__dict__
except:delsys.modules[name]raise
finally:
imp.release_lock()return mod
另外需要说明一下的是,使用Python import自动生成的编译后的文件一般都带有魔数和时间戳,也就是说读取codeObject的时候需要移动8位,但是有些用Python的API生成的不一定带有这个魔数和时间戳的,那么这个时候就不用移位,而直接读取生成codeobject
python函数 模块先加载到内存后执行_Python从内存中使用编译后的模块相关推荐
- python加载机制_Python 模块的加载顺序
基本概念 module 模块, 一个 py 文件或以其他文件形式存在的可被导入的就是一个模块 package 包,包含有 init 文件的文件夹 relative path 相对路径,相对于某个目录的 ...
- python使用openCV图像加载(转化为灰度图像)、使用filter2D函数对图像进行锐化(Sharpen Images)
python使用openCV图像加载(转化为灰度图像).使用filter2D函数对图像进行锐化(Sharpen Images) 目录
- 模块加载及第三方包:Node.js模块化开发、系统模块、第三方模块、package.json文件、Node.js中模块的加载机制、开发环境与生产环境、cookie与session
1.Node.js模块化开发 1.1 JavaScript开发弊端 JavaScript 在使用时存在两大问题,文件依赖和命名冲突. 1.2 软件中的模块化开发 一个功能就是一个模块,多个模块可以组成 ...
- Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3)
Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3) 1. 异步加载爬虫 对于静态页面爬虫很容易获取到站点的数据内容,然而静态页面需要全量加载站点的所有数据,对于网站的访问 ...
- dlopen linux 实例_Linux下c函数dlopen实现加载动态库so文件代码举例
dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...
- Angular路由--模块预加载
2019独角兽企业重金招聘Python工程师标准>>> 预加载是介于直接加载.惰加载的一种方式. 预加载的工作原理 在每次成功的导航后,路由器会在自己的配置中查找尚未加载并且可以预加 ...
- Python之pandas数据加载、存储
Python之pandas数据加载.存储 0. 输入与输出大致可分为三类: 0.1 读取文本文件和其他更好效的磁盘存储格式 2.2 使用数据库中的数据 0.3 利用Web API操作网络资源 1. 读 ...
- res_config_mysql和chan_sip模块的加载分析
1. res_config_mysql的模块加载早于chan_sip,他们的加载函数均为load_module 先分析res_config_mysql的load_module函数 parse_conf ...
- osgi框架 android,基于OSGi的Android应用模块动态加载框架设计与实现
摘要: 伴随着移动互联网科技水平向4G的飞跃,移动终端的使用日趋常态化,移动智能设备的普及率越来越高,得到了大量使用者的追捧.与此同时,各手机操作系统下应用商店里正充斥着琳琅满目的移动应用产品,用户对 ...
最新文章
- HTTP1.0,1.1,2.0,HTTPS
- 【机器学习】从一个风控案例讲起-古老而经典的朴素贝叶斯
- 2008年汶川大地震中的SAP成都研究院
- spring 调用python_Spring http服务远程调用实现过程解析
- git本地commit之后如何同步到远程
- 数据中心实施服务器虚拟化前的十大思考
- 解决“/bin/bash^M: bad interpreter: No such file or directory”
- 金蝶KIS 13.0专业版破解方法破解安装流程 金蝶KIS 13.0专业版安装流程
- 计算机的cpu故障,计算机cpu常见故障
- 关于安卓刷机的一些基础知识及术语
- Js高级-函数的理解
- 日志(Logger)
- px4原生源码学习-(1)
- GPS 点可视化(英文地图打点,热力图,测距)
- sqrt函数模拟实现的两种方法
- 小型水库雨水情测报和大坝安全监测
- vacuum 数据库 用法_postgresql vacuum操作
- 两进两出热电阻信号隔离变送器
- android studio 7200u,#本站首晒# 多图杀猫 华为MateBook X上手体验
- Ubuntu上python打包为可执行文件方法