在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从内存中使用编译后的模块相关推荐

  1. python加载机制_Python 模块的加载顺序

    基本概念 module 模块, 一个 py 文件或以其他文件形式存在的可被导入的就是一个模块 package 包,包含有 init 文件的文件夹 relative path 相对路径,相对于某个目录的 ...

  2. python使用openCV图像加载(转化为灰度图像)、使用filter2D函数对图像进行锐化(Sharpen Images)

    python使用openCV图像加载(转化为灰度图像).使用filter2D函数对图像进行锐化(Sharpen Images) 目录

  3. 模块加载及第三方包:Node.js模块化开发、系统模块、第三方模块、package.json文件、Node.js中模块的加载机制、开发环境与生产环境、cookie与session

    1.Node.js模块化开发 1.1 JavaScript开发弊端 JavaScript 在使用时存在两大问题,文件依赖和命名冲突. 1.2 软件中的模块化开发 一个功能就是一个模块,多个模块可以组成 ...

  4. Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3)

    Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3) 1. 异步加载爬虫 对于静态页面爬虫很容易获取到站点的数据内容,然而静态页面需要全量加载站点的所有数据,对于网站的访问 ...

  5. dlopen linux 实例_Linux下c函数dlopen实现加载动态库so文件代码举例

    dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...

  6. Angular路由--模块预加载

    2019独角兽企业重金招聘Python工程师标准>>> 预加载是介于直接加载.惰加载的一种方式. 预加载的工作原理 在每次成功的导航后,路由器会在自己的配置中查找尚未加载并且可以预加 ...

  7. Python之pandas数据加载、存储

    Python之pandas数据加载.存储 0. 输入与输出大致可分为三类: 0.1 读取文本文件和其他更好效的磁盘存储格式 2.2 使用数据库中的数据 0.3 利用Web API操作网络资源 1. 读 ...

  8. res_config_mysql和chan_sip模块的加载分析

    1. res_config_mysql的模块加载早于chan_sip,他们的加载函数均为load_module 先分析res_config_mysql的load_module函数 parse_conf ...

  9. osgi框架 android,基于OSGi的Android应用模块动态加载框架设计与实现

    摘要: 伴随着移动互联网科技水平向4G的飞跃,移动终端的使用日趋常态化,移动智能设备的普及率越来越高,得到了大量使用者的追捧.与此同时,各手机操作系统下应用商店里正充斥着琳琅满目的移动应用产品,用户对 ...

最新文章

  1. HTTP1.0,1.1,2.0,HTTPS
  2. 【机器学习】从一个风控案例讲起-古老而经典的朴素贝叶斯
  3. 2008年汶川大地震中的SAP成都研究院
  4. spring 调用python_Spring http服务远程调用实现过程解析
  5. git本地commit之后如何同步到远程
  6. 数据中心实施服务器虚拟化前的十大思考
  7. 解决“/bin/bash^M: bad interpreter: No such file or directory”
  8. 金蝶KIS 13.0专业版破解方法破解安装流程 金蝶KIS 13.0专业版安装流程
  9. 计算机的cpu故障,计算机cpu常见故障
  10. 关于安卓刷机的一些基础知识及术语
  11. Js高级-函数的理解
  12. 日志(Logger)
  13. px4原生源码学习-(1)
  14. GPS 点可视化(英文地图打点,热力图,测距)
  15. sqrt函数模拟实现的两种方法
  16. 小型水库雨水情测报和大坝安全监测
  17. vacuum 数据库 用法_postgresql vacuum操作
  18. 两进两出热电阻信号隔离变送器
  19. android studio 7200u,#本站首晒# 多图杀猫 华为MateBook X上手体验
  20. Ubuntu上python打包为可执行文件方法

热门文章

  1. jQuery checkbox全选问题
  2. ASP.NET MVC 3.0学习系列文章(开始学习MVC)
  3. Ubuntu下安装VirtualBox和Android 安装到虚拟机中
  4. 程序员面试金典——17.9词频统计
  5. 剑指offer——面试题20:顺时针打印矩阵
  6. PTA--Reversing Linked List
  7. Pytorch中的collate_fn函数用法
  8. 手把手教你使用 Clion 开发 Linux C++ 项目
  9. 深入理解Web Service
  10. Word怎么转换成PDF?